【Java自学笔记|接口之间的继承】原文地址:http://socket.blog.163.com/blog/static/209873004200931511140616/
在JAVA中,众所周知,一个类只能继承另一个类。一个接口则可以实现多个接口,JAVA此措施一定程序上弥补了类只能单一继承的遗憾,比如实现多线程的类可以继承Thread,也可以实现Runnable接口,那么当你需要去继承如JFrame类的时候,你只能用后者去实现。如果再要响应鼠标事件,那再implements MouseListener这个接口。可能大家对于接口之间的继承,很少碰到,其实这只是语法层次上的讨论,在实现设计时,很少会这样做。接口之间继承用extends关键字,可以继承多个接口。并不是用extends 后边就只能有一个类。 interface A{ public void f();
}
interface B{ public int f();
}
interface C extends A,B{}
这里是编译出错的。只用返回类型不同,来区分方法是出错的。下例不出现这种情况,但也出现极大的混淆,并不编译出错,只是class E 中的mB方法是一种覆盖,当方法签名完全一致时,优先考虑是覆盖。
interface A{
public static final int PI = 3.14;
//通常情况一个实现类可以不加接口名访问接口常量!
void mA();
}
interface B{
public static final int PI = 3.15;
//下方C 去多重继承这两个接口时会产生混淆,所以调用接口常量一律加上接口名,否则编译失败!出错:The field PI is ambiguous
void mA();
void mB();
}
interface C extends A,B{ void mC();
}
class D implements B{
public void mB(){
System.out.println("D.mB");
}
}
public class E extends D implements C{
public void mA(){}
public void mB(){//注:这里就一种覆盖class D中mB方法的行为,并不是实现C中的mB方法。
System.out.println("E.mB");
}
public void mC(){
}
public static void main(String[] args) {
D ref1 = new E();
ref1.mB();
((D)ref1).mB();
//动态绑定到E类中的mB方法
D ref2 = new D();
ref2.mB();
//只用自身的方法。
}
}
如果延伸开来说的话,implements给编译器的指示,就是要你去检查所实现的实体类中有否此方法,即使这个方法是从父类继承下来的。接口是一种规程,只要遵守了这种规程的任何方法都是可行的。所以接口具有很强的开放性,所以设计模式中提倡面向接口编程,因为接口是开放的,被大家都接受的,所以也是更加稳定的。如下边的代码:
interface I{
void fun();
}
class G{
public void fun(){
System.out.println("G.fun");
}
}
class H extends G implements I{//这个类并没有实现接口I 中的方法fun,只是继承自父类。
public static void main(String[] args) {
new G().fun();
}
}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)