按照理解,一般都是说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的值

 package Lesson1218Thread;

 public interface TestIFA {
int a = 0;
int b = 1;
int c = 2; void printInfo(); } package Lesson1218Thread; public interface TestIFB {
int a = 4;
int b = 5;
int c = 6 ; void printInfo();
} package Lesson1218Thread; public interface TestIFC extends TestIFA,TestIFB {
//int d = 4;
int a = 7;
} package Lesson1218Thread; public class IFDemo implements TestIFC{ public static void main(String[] args) { IFDemo ifdemo = new IFDemo();
System.out.println("a is "+ifdemo.a); //a is 7, 因为这个地方实现接口TestIFC, 若是TestIFB, 则输出a is 4. } @Override
public void printInfo() {
System.out.println("which IF ?????"); } }

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

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

 package Lesson1218Thread;

 public class IFDemo implements TestIFA,TestIFC{   //同时实现两个接口

     public static void main(String[] args) {

         IFDemo ifdemo = new IFDemo();
System.out.println("a is "+ifdemo.a); //编译错误 } @Override
public void printInfo() {
System.out.println("which IF ?????"); } }

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

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

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

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

 package Lesson1218Thread;

 public interface TestIFA {
int a = 0;
int b = 1;
int c = 2; void printInfo(); } package Lesson1218Thread; public interface TestIFB {
int a = 4;
int b = 5;
int c = 6 ; String printInfo();
} package Lesson1218Thread; public interface TestIFC extends TestIFA,TestIFB { //编译错误
//int d = 4;
int a = 7;
}

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

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

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

Java 接口多继承的更多相关文章

  1. java接口可以继承多个接口

    接口是常量值和方法定义的集合.接口是一种特殊的抽象类.   java类是单继承的.classB Extends classA java接口可以多继承.Interface3 Extends Interf ...

  2. JAVA接口的继承与集合

    复习 20190701 接口补充 一. java是单继承多实现 单继承: 一个类只能有一个父类 public class D extends D1 { } 2. 多实现 一个类可以同时实现多个接口 当 ...

  3. java 接口与继承

    一.继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构 ...

  4. JAVA 接口与继承作业——动手动脑以及课后实验性问题

    一.继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构 ...

  5. Java接口与继承作业

    为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 因为子类继承了父类,那么就默认的含有父类的公共成员方法和公共成员变量,这些方法和变量在子类里不再重复声明.如果 ...

  6. Java 接口与继承 道至简第六章发表阅读笔记

    一.继承条件下的构造方法调用 class Grandparent { public Grandparent() { System.out.println("GrandParent Creat ...

  7. java接口与继承

    class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } p ...

  8. Java:接口继承接口 (多继承机制)

    在看API文档时,突然发现一个接口可以是其他接口的子接口,这说明接口之间会存在继承的关系.查找了相关的资料,做一个总结. 是继承还是实现 首先要搞清楚接口之间的关系使用的关键字是extends还是im ...

  9. java 类的继承和接口的继承

    父类 public class person { String name; int age; void eat(){ System.out.println("吃饭"); } voi ...

随机推荐

  1. zabbix_agent添加到系统服务启动(八)

    Centos6.5上安装了zabbix_agent后,需要把zabbix_agent添加到系统服务启动,要不然每次要一长串路径再启动,挺麻烦的. 步骤: 1)拷贝zabbix解压包里的zabbix_a ...

  2. centos7以rpm方法装mysql5.7及大坑

    环境: CentOS Linux release 7.5.1804 (Core)   Mysql版本: MySQL-5.7.17-1.el6.x86_64.rpm-bundle.tar   下载地址( ...

  3. 使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)

    使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development.production) --mode 指定环境模式 ...

  4. LOJ 2991 「THUSC 2016」补退选——trie+线段树合并或vector

    题目:https://loj.ac/problem/2291 想了线段树合并的做法.就是用线段树维护 trie 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和 ...

  5. Linux服务器同步Intetnet时间

    Linux服务器同步Intetnet时间 在使用linux服务器(虚拟机)的过程中,经常会发现使用一段时间后,linux服务器的时间和我的宿主机的时间不一致,而宿主机的时间确实是internet时间, ...

  6. Android 动态注册JNI函数

    1.JNI函数注册方式 在Android开发中,由于种种原因我们需要调用C/C++代码,在这个时候我们就需要使用jni了, jni在使用时要对定义的函数进行注册,这样java才能通过native关键字 ...

  7. PAT 乙级 1092 最好吃的月饼 (20 分)

    1092 最好吃的月饼 (20 分) 月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出 ...

  8. WPF Binding Mode,UpdateSourceTrigger

    WPF 绑定模式(mode) 枚举值有5个1:OneWay(源变就更新目标属性)2:TwoWay(源变就更新目标并且目标变就更新源)3:OneTime(只根据源来设置目标,以后都不会变)4:OneWa ...

  9. Vue 折叠面板Collapse在标题上添加组件后,阻止面板冒泡的用法

    iView组件中,折叠面板Collapse点击面板标题部分,会出现面板收起或展开的效果.那么在面板标题后面再添加下拉框之类的组件时,会出现跟面板点击一样的效果,这时候就需要阻止冒泡的用法了.具体代码: ...

  10. 概念吓死人的webservice

    前倾提要:这是我七拼八凑,自己用手打出来的头一篇了!都是别人的想法,我抄袭的,我坦白,我这只是总结一下觉得有用的 本来题目想叫(1)REST API 和WebService(2)REST 样式和 SO ...