结缘接口时名字争辨难点

  在此之前未有在意到完毕四个接口大概会存在方法争论的标题,在《Thinking in
Java》中看看三个妙不可言的例证,其本质是重载和重写的题材,关于重载和重写的定义和差别可参照另1篇小说Java基础一:面向对象的风味。首先看例子:

 1   interface I1 {
 2         void f();
 3     }
 4 
 5     interface I2 {
 6         int f(int i);
 7     }
 8 
 9     interface I3 {
10         int f();
11     }
12 
13     class C {
14         public int f(){
15             return 1;
16         }
17     }
18 
19     class C2 implements I1,I2{//重载
20         @Override
21         public void f() {}
22 
23         @Override
24         public int f(int i) {
25             return 0;
26         }
27     }
28 
29     class C3 extends C implements I2{
30         @Override
31         public int f(int i) {//重载
32             return 0;
33         }
34     }
35 
36     class C4 extends C implements I3{
37         @Override
38         public int f() {   //重写
39             return 0;
40         }
41     }
42 
43 //    class C5 extends C implements I1{}
44 //
45 //    interface I4 extends I1,I3{}
46 
47   public static void main(String[] args){
48         MethodCollision methodCollision = new MethodCollision();
49         C4 c4 = methodCollision.new C4();
50         System.out.println(c4.f());//输出0
51     }

   当中接口I第11中学留存方法void f(),I2中存在int f(int i),I3中存在int
f()
,类C中存在int f()的方法。

  C二类完毕接口I一和I2,在那之中落实的方式void f()int f(int
i)
具备分裂的签署,属于重载;

  C三类完结接口I二、继承C,C叁达成I第22中学的int f(int i),并继承C中的int
f()
主意,它们有着分裂的签订契约,属于重载;

  C四类落成接口I三、继承C,C4贯彻I三中的int f(),并继承C中的int
f()
主意,它们具有相同的签字,并且重回值类型也一如既往,属于重写(从程序输出0能够印证);

  C5类达成接口I一、继承C,理论上,C伍类会独家实现和继承I1方法void
f()
和C方法int
f()
,它们持有相同的签订契约,分裂的回来值类型,既不是重写,也不可能重载,故编写翻译器提醒错误;

  I四接口继承I一和I叁,同样理论上接轨void f()int
f()
,但既不是重写,也不知所可重载,编写翻译器报错。


  另贰个幽默问题是,笔者借使将接口I1中的void
f()
改为int f()**,会发出什么样作用啊?

 1     interface I1 {
 2         int f();
 3     }
 4 
 5     interface I2 {
 6         int f(int i);
 7     }
 8 
 9     interface I3 {
10         int f();
11     }
12 
13     class C {
14         public int f(){
15             return 1;
16         }
17     }
18 
19     class C2 implements I1,I2{//重载
20         @Override
21         public int f() {
22             return 0;
23         }
24 
25         @Override
26         public int f(int i) {
27             return 0;
28         }
29     }
30 
31     class C3 extends C implements I2{
32         @Override
33         public int f(int i) {//重载
34             return 0;
35         }
36     }
37 
38     class C4 extends C implements I3{
39         @Override
40         public int f() {   //重写
41             return 0;
42         }
43     }
44 
45     class C5 extends C implements I1{}//不重写该函数,继承自C的方法即为实现
46 
47     interface I4 extends I1,I3{}
48 
49     class C6 implements I4{//I1和I3的方法一样,实现类只实现一个
50         @Override
51         public int f() {
52             return 0;
53         }
54     }
55 
56     public static void main(String[] args){
57         MethodCollision methodCollision = new MethodCollision();
58         C4 c4 = methodCollision.new C4();
59         System.out.println(c4.f());//0
60 
61         C5 c5 = methodCollision.new C5();
62         System.out.println(c5.f());//1
63     }

   个中接口I第11中学存在方法int f(),I2中存在int f(int i),I3中存在int
f()
,类C中存在int f()的方法。

  C二类达成接口I一和I贰,个中落到实处的艺术int f()int f(int
i)
怀有差异的签字,属于重载;

  C叁类完毕接口I贰、继承C,属于重载;

  C肆类达成接口I三、继承C,属于重写(从程序输出0能够证实);

  C伍类实现接口I1、继承C,C五类会分别完结和一连I一方法int
f()
和C方法int
f()
,其与C肆类是一律的,它是重写啊?不是,因为其后续自C的函数已经完结了该接口,没有重写(从程序输出一方可证实);

  I四接口继承I1和I三,同时继续I壹和I3的int
f()
,它们具有同样的情势签名和重临值类型,所以I四具有叁个int
f()
(可通过C陆完结类看出);

  C陆类完成接口I四,具有一个落到实处函数int f()。

 总结:

  • 类不得以多重继承,接口可以多重继承;
  • 整合接口时,可能会设有方法重载和重写的难点,并且大概会引入代码的繁杂,下跌代码可读性,故尽量防止那种状态;
  • 透过该例,可以学学继承、接口实现、重载和重写概念,个中一些是类继承的艺术也可以当作完成接口的兑现形式。