/* 使用接口的时候,需要注意: 1. 接口是没有静态代码块或者构造方法的。 2. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。 格式: public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB { // 覆盖重写所有抽象方法 }
3. 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
A接口
package cn.itcast.day10.demo02;
public interface MyInterfaceA {
// 错误写法!接口不能有静态代码块
// static {
//
// }
// 错误写法!接口不能有构造方法
// public MyInterfaceA() {
//
// }
public abstract void methodA();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默认方法AAA");
}
}
B接口
package cn.itcast.day10.demo02;
public interface MyInterfaceB {
// 错误写法!接口不能有静态代码块
// static {
//
// }
// 错误写法!接口不能有构造方法
// public MyInterfaceA() {
//
// }
public abstract void methodB();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默认方法BBB");
}
}
实现类有多个接口
package cn.itcast.day10.demo02;
public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB {
@Override
public void methodA() {
System.out.println("覆盖重写了A方法");
}
@Override
public void methodB() {
System.out.println("覆盖重写了B方法");
}
@Override
public void methodAbs() {
System.out.println("覆盖重写了AB接口都有的抽象方法");
} // A B 都有 覆盖一次
@Override
public void methodDefault() {
System.out.println("对多个接口当中冲突的默认方法进行了覆盖重写");
}
}
只覆盖重写了一次。 4. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
package cn.itcast.day10.demo02;
public abstract class MyInterfaceAbstract implements MyInterfaceA, MyInterfaceB {
@Override
public void methodA() {
}
// 没有写methodB那么实现类是抽象类
@Override
public void methodAbs() {
}
@Override
public void methodDefault() {
}
}
抽象方法methodB没有重写覆盖,那么实现类成为了抽象类。 5. 如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写(A,B两个接口中都写了默认方法,冲突了)。见3.中实现类中覆盖重写了A,B中的两个默认方法 6. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。
Fu类
package cn.itcast.day10.demo02;
public class Fu {
public void method() {
System.out.println("父类方法");
}
}
MyInterface接口
package cn.itcast.day10.demo02;
public interface MyInterface {
public default void method() {
System.out.println("接口的默认方法");
}
}
直接父类当中的方法,和接口当中的默认方法产生了冲突。 Zi子类
package cn.itcast.day10.demo02;
public class Zi extends Fu implements MyInterface {
}
调用method方法,看哪个优先
package cn.itcast.day10.demo02;
public class Demo01Interface {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
调用子类对象的method方法,发现使用的是父类中的而不是接口中的方法,父类的优先级比接口优先级更高。 运行结果:
父类方法
Process finished with exit code 0
*/