接口(三)——JAVA的多重继承
一、接口的作用
①、为了能够向上转型为多个基类型
②、防止客户端程序员创建该类的对象——同抽象类
二、通过继承扩展接口
interface Monster{ void menace(); } interface Lethal{ void kill(); } //继承接口 但用的是extends interface DangerousMonster extends Monster{ void destory(); } //支持多继承 interface Vampire extends Lethal,Monster{ void drinkBlood(); }
三、组合接口的名字冲突
//接口和类具有相同的方法 interface CanFight{ void fight(); } class ActionCharacter{ public void fight(){} } //Hero可以不许要重写void fight()也可以创建 class Hero extends ActionCharacter implements CanFight{ }
当如果方法名一样,签名和返回值都不一样:
//接口和类具有相同的方法,不同的返回值 interface CanFight{ int fight(); } class ActionCharacter{ public void fight(){} } class Hero extends ActionCharacter implements CanFight{ } //直接编译报错:说明重载方法通过返回值是区分不开的
四:接口的适配模式
对象①获取已继承接口③的类②的对象,通过类②向上转型并调用类②的方法。
五:接口中的域
①、放入接口中的任何成员变量域都自动是static 和 final
②、接口中的方法都自动是Public
③、接口中的成员变量不能够为空,一定要被初始化(可以是非常量表达式)
public interface RandVlas{ int RANDOM_INT = new Random().nextInt(10); }
④、因为是static的所以会在任何域首次被访问的时候初始化。
六、嵌套接口
(一)、接口可以嵌套在类或者其他接口中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//接口嵌套在类中 class A{ interface B{ void f(); } } //接口嵌套在其他接口中 interface E{ interface G{ void f(); } //接口自带的方法 void g(); }
如何调用其中的接口:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//调用声明在类中的接口 public class BImp implements A.B{ public void f(){} } //调用声明在接口中的接口 public class EGImp implements E.G{ public void f(){} } //E接口直接声明的方法 public class EImp implements E{ public void g(){} }
注意事项:
1.嵌套在另一个接口的接口自动为Public
2.实现某个接口的时候不需要嵌套实现其内部的接口
(二)、接口被实现为private,其优点
举例:前期准备
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Test { private A mA; //声明A接口 private interface A{ public void f(); } //继承接口的实现类 public class AImp implements A{ @Override public void f() { // TODO Auto-generated method stub } } //外界获取A public A getA(){ return new AImp(); } //接收A,并调用其方法 public void receiveA(A a){ mA = a; mA.f(); } }
调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class NestingInterfaces { public static void main (String args[]){ Test t1 = new Test(); Test t2 = new Test(); t2.receiveA(t1.getA()); /*错误:A a = t1.getA(); * t1.getA().f(); * */ } }
作用:
Test.AImp只能被其自身使用,无法说其实现了private 接口A。强制类不允许向上转型。
getA()可以将返回值交给有权利使用它的对象receiveA()
七、接口与工厂方法(详见HeadFirst设计模式)