以下是通过实际操作得出的结论,欢迎指正:
- 接口:
1.1. 接口之间继承,静态方法无法继承,接口静态方法的调用只能通过原接口调用
1.2. 接口之间继承,接口的静态成员变量和静态方法都可以被重写,重写后就算出现1.4的情况也没问题
1.3. 接口之间单继承(例如:接口 A extends 接口 B),则所有成员变量都会被继承
1.4. 接口之间多继承(例如:接口 A extends 接口 B, C),如果B,C中有相同的成员变量 a ,则会出现歧义,编译报错
1.5. 接口的静态成员变量可以被子类(不是接口)继承和重写,静态方法只能被重写。(这一条只仅对单个接口有效)
1.6. 接口中的default方法可以被继承和重写。(这一条只仅对单个接口有效) - 类/抽象类
2.1. 类与类之间的继承,静态成员变量和静态方法都是可以被继承和重写
2.2. 普通类/抽象类 implements 单接口,会继承静态成员变量,静态方法不会被继承,接口静态方法的调用只能通过原接口调用
2.3. 普通类/抽象类 implements 多接口,首先它满足2.2。如果有相同的成员变量或相同的default方法,编译报错
2.4. C类实现了接口A、B,如果A、B中有两个相同的default方法,编译会报错。
总结
接口的静态方法的调用都要通过原接口调用,而类中的静态方法会被继承可以用子类调用。
特例,如果实现类实现了A,B,且A和B中有相同的静态方法或静态成员变量,则实现类无法调用父类中静态方法或静态成员变量。因为java无法判断出该调用哪一个方法(至少现在不支持这种写法)。
为什么接口中的变量必须是static的?
答:因为接口不能实例化,访问的唯一方式就是接口名,因此如果有变量必须是static的。
为什么接口中的变量一定要初始化?
答:因为变量是final修饰的,如果不初始化就没有意义了。
类的静态成员会随某一个静态成员的被使用或类的实例化而被初始化。
网友评论