Java 接口多继承
按照理解,一般都是说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 接口多继承的更多相关文章
- java接口可以继承多个接口
接口是常量值和方法定义的集合.接口是一种特殊的抽象类. java类是单继承的.classB Extends classA java接口可以多继承.Interface3 Extends Interf ...
- JAVA接口的继承与集合
复习 20190701 接口补充 一. java是单继承多实现 单继承: 一个类只能有一个父类 public class D extends D1 { } 2. 多实现 一个类可以同时实现多个接口 当 ...
- java 接口与继承
一.继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构 ...
- JAVA 接口与继承作业——动手动脑以及课后实验性问题
一.继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构 ...
- Java接口与继承作业
为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 因为子类继承了父类,那么就默认的含有父类的公共成员方法和公共成员变量,这些方法和变量在子类里不再重复声明.如果 ...
- Java 接口与继承 道至简第六章发表阅读笔记
一.继承条件下的构造方法调用 class Grandparent { public Grandparent() { System.out.println("GrandParent Creat ...
- java接口与继承
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } p ...
- Java:接口继承接口 (多继承机制)
在看API文档时,突然发现一个接口可以是其他接口的子接口,这说明接口之间会存在继承的关系.查找了相关的资料,做一个总结. 是继承还是实现 首先要搞清楚接口之间的关系使用的关键字是extends还是im ...
- java 类的继承和接口的继承
父类 public class person { String name; int age; void eat(){ System.out.println("吃饭"); } voi ...
随机推荐
- 聊聊Java反射
反射是Java最重要的特性.通过Java反射可以在运行时知道一个类的所有成员和方法,知道一个对象的类类型.成员和方法的所有信息,进而调用对象的方法或生成对象的代理或包装类. Java是面向对象语言,除 ...
- [转].NET 性能测试工具 -- 事件跟踪器(ETW)
.NET 性能测试工具 -- 事件跟踪器(ETW) 内容预告: Windows内置工具(性能计数器) 事件跟踪器(WPT,PerfMoniter,PerfView,自定义ETW) 时间分析 内存分配分 ...
- element-ui的不稳定性
伤脑筋的版本升级 element-ui升级到2.0版本了! element-ui作为比较成熟的广为人知的前端框架,原本满怀热情的去学习,也基于element-ui搭建出了一套系统,可是它居然升级了! ...
- 干掉hao123劫持浏览器主页
原因可能是安装某个软件流氓捆绑了IE主页导致的,建议这样尝试: 一.如果安装有三方安全防护类软件,排查流氓软件,建议运行系统自带的Windows Defender或者MSE程序扫描系统. 二.如果有检 ...
- vi 常用 文本编辑 技巧
归纳常用的Vi/Vim 文本编辑技巧,便于以后查阅. 一.把空格替换为换行 :% s/ /\r/g 二.把空行删除 :g/^$/d 三.vim以16进制打开和编辑文件 先用vim以二进制格式打开需要编 ...
- Vue todolist练习 知识点
1.localStorage的用法总结 (1).这儿是什么:局部存储器.它是html5新增的一个本地存储API,所谓localStorage就是一个小仓库的意思,它有5M的大小空间,存储在浏览器中,我 ...
- 爬虫基础线程进程学习-Scrapy
性能相关 学习参考:http://www.cnblogs.com/wupeiqi/articles/6229292.html 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时 ...
- xmanagr 注册机执行ubuntu 桌面程序,ubuntu无需安装 桌面环境
Xshell 5 注册码: 690313-111999-999313Xftp 5 注册码:101210-450789-147200 Xmanager 5 注册码:101210-450789-14720 ...
- 笔记:python (2015)
[开发环境]: Python 3.3 http://rj.baidu.com/soft/detail/25283.html 大小:20.2M 版本:3.3.5150 位数:64 更新日期:2014 ...
- 算术运算,赋值运算,if语句,while,continue语句
算术运算 print(10 / 3)=3.333333333333 print(10 // 3)=3 print(10 ** 2)=100 赋值运算增量赋值 age=18 age+=1 print(a ...