12.接口的相关注意事项
程序员文章站
2022-06-15 13:47:06
...
- Interface.java
public interface Interface {
// 接口中,没有构造方法,不能创建对象。
// 接口中,没有静态代码块。static {}
// 可以定义常量。接口中可以省略public static final这三个关键字
// 接口中的常量必须的赋值,当然罗,常量嘛,规范大写,下划线;
public static final int CHANG_LANG = 0;
// 抽象方法,abstract可以省略,无方法体
public abstract void method1();
// 默认方法,default 不可省略,
// 子类继承或者子类重写,
// 子类需要能使用 Interface.super.method2()来调用我!
// 作用:默认方法可以解决接口升级的问题(接口需要添加新功能,如果加抽象方法,之前实现的类都会报错)
public default void method2() {
System.out.println("子类可以继承,可以重写");
}
// 静态方法,static修饰,供接口直接调用 Interface.method3()。
public static void method3() {
System.out.println("这个是静态方法");
}
/**================================================*/
// 私有方法,private修饰,抽离默认方法之间重复的代码
// 供接口中的默认方法调用
private void method4() {
System.out.println("请在接口内用非静态方法使用我这个私有方法");
}
// 私有静态方法,private修饰,抽离静态方法之间重复的代码
// 供接口中的默认方法或者静态方法调用
private static void method5() {
System.out.println("请在接口中使用我这个私有方法");
}
}
- NoAbs类实现了Interface这个接口
// 使用 implements关键字实现接口
public class NoAbs implements Interface {
// 非抽象子类实现接口
// 1.必须重写接口重点所有抽象方法
// 2.继承了接口的默认方法,可以直接调用,可以重写
// 子类中重写抽象方法,
@Override
public void method1() {
System.out.println("我实现了接口中的抽象方法");
}
// 默认方法的使用,继承or重写,(以重写为栗)
// 如果想使用在接口中的默认方法,只能通过实现类的对象进行调用
// 实现类重写默认方法时,不能写default(子接口中重写必须保留)
@Override
public void method2() {
System.out.println("我重写了接口中的方法");
// super.method2(); 接口实现类中不允许这样写
Interface.super.method2(); // 实现类中需要这样写,估计是一种语法糖
}
// 静态方法的使用,
// @.只能使用接口名调用(实现类中也可以使用)
// 1.不能通过 实现类的 类名 调用
// (因为接口是支持多继承的,有可能父类接口们有重名的静态方法,
// 而且没有优先级,直接使用类名访问,逻辑上是分不清找那个!,
// 这也就说明了如果子类继承的父类有同名的默认方法,必须得重写一次。)
// 2.不能通过 实现类的 对象 调用
public void mydelfMethod1() {
Interface.method3();
// super.method3(); 接口实现类中不允许这样写
}
}
- Interface2接口
public interface Interface2 {
void method1();
default void method2() {
System.out.println("我和第一个接口的默认方法重名了,哈哈");
}
public static void method3() {
System.out.println("我是接口2中的静态方法, 和第一个重名了");
}
void method22(String s);
}
- noAbs2类实现了Interface接口和Interface2接口
// 接口的多实现
public class noAbs2 implements Interface, Interface2{
// 有多个抽象方法时,实现类必须重写所有的抽象方法
// 如果没有将抽象方法实现完,那么此实现类必须是一个抽象类!
// 如果抽象方法有重名的,只需要重写一次
@Override
public void method1() {
System.out.println("两个接口有重复的抽象方法,实现一个就够了");
}
@Override
public void method22(String s) {
System.out.println("实现的第二个接口的抽象方法");
}
// 接口中,有多个默认方法,实现类都可以继承使用。
// 如果继承的接口们中的默认方法有重名冲突的,必须重写一次!!
// 对于各个接口,没有啥调用优先级。
public void method2() {
System.out.println("由于我实现的两个抽象类中有重名的方法,我必须重写一次。");
}
// 静态方法,接口中,存在静态方法同名不会冲突 Interface.methods();
// 父类和实现接口的优先级的问题:
// 当一个类,既继承了一个父类,又实现若干个接口,
// 父类中的成员方法与接口中的默认方法重名,
// 子类就行选择执行父类的成员方法。
}
接口与接口之间的多继承
- Interface3接口继承了Interface接口和Interface2接口
public interface Interface3 extends Interface, Interface2 {
/** 接口的多继承,一个接口能继承一个或者多个接口,
* 同样用extends关键字,子接口继承父接口的方法*/
// 子接口重写默认方法,default关键字需保留(实现类中重写默认方法,不能写default)
// 如果父接口们中的默认方法有重名的,子接口需要重写一次,也就是说接口的多继承有没有啥优先级可分。
@Override
default void method2() {
System.out.println("重写默认方法");
}
// 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用 public static final修饰
public static final String Du = "Do";
}
下一篇: 多分类的 准确率 召回率 代码