jdk16全面学习之jls的第九章Interfaces
这一章是就是针对接口学习的.之前有过接口的初步学习,这里将深入展开.
1 接口的继承没有传递性
1.1 方法的重写
与抽象类不同,接口的方法可以任意的重写和改写.编辑如下代码MethodRewrite.java
interface PointInterface {
int v = 2;
static int sv = 2;
default void move() {
System.out.println("super move");
}
static void move(int x) {
System.out.println("in super " + x);
}
}
interface RealPointInterface extends PointInterface {
default void move() {
System.out.println("sub move");
}
static void move(int x) {
System.out.println("in sub interface " + x);
}
}
class Super implements PointInterface {
public void move() {
PointInterface.super.move();
}
}
class Sub implements RealPointInterface {
public void move() {
System.out.println("in sub call");
RealPointInterface.super.move();
}
public void m() {
RealPointInterface.super.move();
}
static void m(int x) {
System.out.println("in sub object " + x);
}
}
public class MethodRewrite {
public static void main(String[] args) {
//final Super sub = new Sub();
final Sub sub = new Sub();
sub.move();
sub.m();
//sub.move(2);
RealPointInterface.move(2);
}
}
可以看到,即使方法名相同,此时只要输入参数不同,那么就不会报错.这一点与类的继承不同.
1.2 继承不可传递
若是类的继承,则肯定具有传递性,比如类A是类B的子类,类B是C的子类,那么A一定是C的子类.但是接口不存在这种传递性.
放开//final Super sub = new Sub();得到如下报错信息
可知使用了子类接口的类无法转换为使用了父类接口的类,所以接口的继承不具有传递性.
1.3 default方法的调用
Default方法的调用可以分为两种情况,第一是实现类重写了该方法,在实例对象中直接调用,第二是在使用了该接口的类中直接使用super来调用,就像是实例方法的调用一样.注释掉上面放开的语句,运行main方法得到如下结果
可见,不论是default方法还是静态方法,都是类似于类的属性,是和类型也就是左值严格绑定的.
1.4 静态方法无法继承
接口的静态方法也是无法继承的,方法注释//sub.move(2);会得到如下报错
可见,接口的静态方法无法被继承.
2 注解
注解也是接口的一种使用形式,注解的信息通过反射来获取.一些元注解也是自定义注解的基石,这些都是基础的东西.
正因为注解的信息可以通过反射获取,所以很多大型的工程都自定义了一套注解,作为替代xml配置模式的一种手段.目前基于xml配置的已不多见,基本上都是基于注解来配置了.只要事先定义好注解及解析注解的程序,就可以做任何处理了.
3 总结
接口作为非常灵活的java类型,在平时使用中常被用到.关于接口的东西主要是继承相关的,除此之外还有其自带的默认和静态方法,这些方法也是和类型严格绑定的.