java接口的继承_Java 接口多继承[亲测有效]

java接口的继承_Java 接口多继承[亲测有效]按照理解,一般都是说Java类是单继承,但可以实现多个接口。但是可以通过接口来实现类的多继承。(如何通过接口来实现多继承???)那么就一直以为Java里面是单继承,今天看FutureTask源码的时候发现,接口居然可以实现多继承,通过下面例子学习下。一个类只能extends一个父类,但可以implements多个接口。java通过使用接口的概念来取代C++中多继承。与此同时,一个接口则可以同时e…

大家好,欢迎来到IT知识分享网。

按照理解,一般都是说Java 类是单继承,但可以实现多个接口。但是可以通过接口来实现类的多继承。(如何通过接口来实现多继承???)

那么就一直以为Java里面是单继承,今天看FutureTask源码的时候发现,接口居然可以实现多继承,通过下面例子学习下。

一个类只能extends一个父类,但可以implements多个接口。java通过使用接口的概念来取代C++中多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。因而,Java中的接口是支持多继承的。

下面先对接口做个总结:

1>接口中的成员变量默认都是public,static,final(都可省略),必须被显示初始化,即接口中的成员变量必须是常量。

2>接口中的方法默认都是public abstract类型的(都可省略),没有方法体。

3>接口中只能包含public abstract类型的成员方法和public static final类型的成员变量。

4>接口中没有构造方法,不能被实例化

5>一个接口不能实现(implements)另一个接口,但是可以多继承接口

6>Java中必须通过类来实现接口中的抽象方法

7>当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类

8>不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

9>一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承

下面给一个接口多继承的例子,注意打印的a的值

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 packageLesson1218Thread;

2

3 public interfaceTestIFA {

4 int a = 0;

5 int b = 1;

6 int c = 2;

7

8 voidprintInfo();

9

10 }

11

12 packageLesson1218Thread;

13

14 public interfaceTestIFB {

15 int a = 4;

16 int b = 5;

17 int c = 6;

18

19 voidprintInfo();

20 }

21

22 packageLesson1218Thread;

23

24 public interface TestIFC extendsTestIFA,TestIFB {

25 //int d = 4;

26 int a = 7;

27 }

28

29 packageLesson1218Thread;

30

31 public class IFDemo implementsTestIFC{

32

33 public static voidmain(String[] args) {

34

35 IFDemo ifdemo = newIFDemo();

36 System.out.println(“a is “+ifdemo.a); //a is 7, 因为这个地方实现接口TestIFC, 若是TestIFB, 则输出a is 4.

37

38 }

39

40 @Override

41 public voidprintInfo() {

42 System.out.println(“which IF ?????”);

43

44 }

45

46 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

重点关注line36,   测试类实现哪个接口,输出的a就是哪个接口定义的值。

问题1:若同时实现两个接口,调用里面相同变量 , 编译错误。 如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 packageLesson1218Thread;

2

3 public class IFDemo implementsTestIFA,TestIFC{ //同时实现两个接口

4

5 public static voidmain(String[] args) {

6

7 IFDemo ifdemo = newIFDemo();

8 System.out.println(“a is “+ifdemo.a); //编译错误

9

10 }

11

12 @Override

13 public voidprintInfo() {

14 System.out.println(“which IF ?????”);

15

16 }

17

18 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

line8 会报编译错误: The field ifdemo.a is ambiguous

程序不能找到应该调用哪个里面的a.

结论:接口多继承时,接口里面有定义相同的变量,如果实现类要调用相同变量,必须显示指出来。如 TestIFA.a 。

问题2:同时实现两个接口,若接口中的成员方法名字相同,但是返回值不一样,

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 packageLesson1218Thread;

2

3 public interfaceTestIFA {

4 int a = 0;

5 int b = 1;

6 int c = 2;

7

8 voidprintInfo();

9

10 }

11

12 packageLesson1218Thread;

13

14 public interfaceTestIFB {

15 int a = 4;

16 int b = 5;

17 int c = 6;

18

19 String printInfo();

20 }

21

22 packageLesson1218Thread;

23

24 public interface TestIFC extendsTestIFA,TestIFB { //编译错误

25 //int d = 4;

26 int a = 7;

27 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

接口TestIFA中含有成员方法voidprintInfo();   而接口TestIFB中含有成员方法String printInfo();  两个成员方法返回值不一样。

接口TestIFC想继承上面两个类,编译错误。The return types are incompatible for the inherited methods TestIFA.printInfo(), TestIFB.printInfo()

结论:被多继承的接口中,不能有方法名相同,但是返回值不一样的函数。否则没法多继承。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13648.html

(0)
上一篇 2023-03-21 21:00
下一篇 2023-03-23 11:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信