第一章 接口(二)
1.4接口的多实现
在继承中,一个类只能继承一个父类,而在接口中,一个类可以实现多个接口,并且一个类能继承一个父类,同时实现多个接口。
实现格式:
class 类名 [extends 父类名] implements 接口1,接口2,接口3...{
//重写接口中抽象的方法【必须】
//重写接口中默认的方法【不重名时可选】
}
1.4.1抽象方法
在接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次。代码如下:
定义多个接口:
interface A{
public abstract void showA();
public abstract void show();
}
interface B{
public abstract void showB();
public abstract void show();
}
定义实现类:
public class C implements A,B{
@override
public void showA(){
System.out.println("showA");
}
@override
public void showB(){
System.out.println("showB");
}
@override
public void show(){
System.out.println("show");
}
}
1.4.2默认方法
接口中,有多个默认方法时,实现类都可以继承使用。如果默认方法有重名的,必须重写一次。代码如下:
定义多个接口:
interface A{
public default void methodA(){}
public default void method(){}
}
interface B{
public default void methodB(){}
public default void method(){}
}
定义实现类:
public class C implements A,B{
@override
public void method(){
System.out.println("method");
}
}
1.4.3静态方法
在接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口访问静态方法。
优先级问题
当一个类既继承一个父类,又实现多个接口是,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。代码如下:
定义接口:
interface A{
public default void methodA(){
System.out.println("AAAAAAAA");
}
}
定义父类:
class D{
public void methodA(){
System.out.println("DDDDDDDD");
}
}
定义子类:
class C extends D implements A{
//未重写methodA方法
}
定义测试类:
public class Test{
public static void main(String[] args){
C c = new C();
c.methodA();
}
}
输出结果:
DDDDDDDD
1.5接口的多继承【了解】
一个接口能继承另一个或者多个接口。接口的继承使用 extends 关键字,子接口继承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。代码如下:
定义父接口:
interface A {
public default void method(){
System.out.println("AAAAAAAAAAAAAAAAAAA");
}
}
interface B {
public default void method(){
System.out.println("BBBBBBBBBBBBBBBBBBB");
}
}
定义子接口:
interface D extends A,B{
@Override
public default void method() {
System.out.println("DDDDDDDDDDDDDD");
}
}
小贴士:
子接口重写默认方法时,default关键字可以保留。
子类重写默认方法时,default关键字不可以保留。
1.6其他成员特点
- 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。
- 接口中,没有构造方法,不能创建对象。
- 接口中,没有静态代码块。