接口
在Java中接口是一个用于实现多继承功能的机制。
展开来说,Java只支持单继承,即:一个类只能继承自一个父类。
但一个类却能够实现多个接口,从而实现类似拥有多个父类的功能。
小结
接口的定义
完整定义: [public][abstract]interface 接口名[extends 父接口列表]{ [[public static final]常量类型 常量名 = 常量值;] [[public abstract]返回类型 方法名(参数列表);] [[public] static 返回类型 方法名(参数列表){}] //Java 8 [[public] default 返回类型 方法名(参数列表){}] //Java 8 }
1.接口是静态常量(static final)和抽象方法(abstract )的集合,某种意义上类似于抽象类,但它不是类。
2.在非(集成环境下)默认的同一个包中,接口与接口的实现类,一般用public修饰这两者中的一个(一个java文件中只允许有一个共有类)。否则在默认权限下,只有同一个包的类才能实现该接口,或者只有同一个包中的类才能继承该接口的实现类,这两个问题在外包import也不能解决。(涉及后面要讲的“包”)
3.后续Java8在接口中追加了静态方法和默认方法。用public修饰的静态方法(static),具有以下特性:
①以接口名.方法名(参数列表)的形式访问;
②不能被子接口继承,也不能被实现类继承;
用public修饰的默认方法(default),具有以下特性:
①能被子接口继承,也能被实现类继承;
②需要通过对象调用;
接口的实现
1.接口实现时需注意以下几点:
①接口定义时可以省去修饰方法的public,但实现时需显示的写出来,否则会造成“范围缩减”从而产生错误。而在实现时abstract反而要去掉;
②若实现类为非抽象类,则需实现接口中的所有抽象方法;
2.当实现类一次实现多个接口时,多个接口中都有同名的A方法:需在实现类中重新定义方法A,若想等效于某一父接口中的定义,可在实现类中方法A的方法体内写“父接口名.super.方法A.(参数列表)”;
3. 实现类的父类中有与接口中有同名的方法:生成实例化对象后,调用时会采用父类的方法,即:类>接口。
接口与多态
使用方法类似4.3中小结第5点:
声名一个接口的变量A(对象);
创建一个实现类的实例化对象b;
将b赋给A,通过“A.方法(参数列表)”来调用实现类中的方法;
同理,A可“指向”不同实现类的实例化对象,并调用方法,以实现多态。
接口与抽象类
接口也是抽象的,不能实例化对象,但接口与抽象类有以下区别:
①接口中没有变量,只有常量;
②接口中所有方法都是抽象的;
③接口能继承多个父接口,但不能继承类;
④接口与实现它的类不构成类的继承体系,即:不相关的类也可以实现相同的接口;
⑤接口相较于抽象类,没有强行形成继承关系。能使子类对象向上转型为多个接口类型(接口与多态);
接口的扩展
1.在接口定义甚至已经使用后,想要再次拓展时,为不影响原接口工作,可以通过继承原有的接口,并在子接口中增添新的方法。
2.一个接口能继承多个接口,故也可以用作合并多个接口。
3.另外,子接口同样可以重定义父接口中的方法。