今天看到有人在文章中说:
在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现 两个接口,接口中定义了一样的默认方法,必须重写,不然会报错
package interfacetest;
/**
* @author liuxx
* @date 2021/1/19 14:47
*/
public interface Interface01 {
void method();
default void method2(){
System.out.println("Interface01 default");
}
static void method3(){
System.out.println("Interface01 static");
}
}
package interfacetest;
/**
* @author liuxx
* @date 2021/1/19 14:47
*/
public interface Interface02 {
void method();
default void method2(){
System.out.println("Interface02 default");
}
static void method3(){
System.out.println("Interface02 static");
}
}
package interfacetest;
/**
* @author liuxx
* @date 2021/1/19 15:09
*/
public class FatherClass {
static void method4(){
System.out.println("FatherClass static method4");
}
public void method6(){
System.out.println("FatherClass public method6");
}
}
package interfacetest;
/**
* @author liuxx
* @date 2021/1/19 14:48
*/
public class InterfaceImpl extends FatherClass implements Interface01, Interface02 {
@Override
public void method() {
}
}
验证结果:好家伙直接编译报错
报错处理:实现method2()
继续编译:依旧报错
报错原因分析:因为接口中定义的default方沟必须被实现类实现,但是由于method4 在FatherClass是static修饰,所以不会被实现类重写,于是存在冲突,(具体怎么解释我也不太清楚 -! 就放这里看哪个大佬能指点一下)
好了现在不报错了,但是发现有这样的一个标记,这是啥呢,看下idea的提示
英文翻译大家看一下,我就不翻译了,反正就是说这里的method6是对Interface01中的method6的实现。因为fatherclass的子类InterfaceImpl实现了这个接口。(具体为啥我也不明白)。这里好像对上面的那个遗留问题也做了一部分解释,(猜想1:子类无法对接口中的default方法重写时加上static,因为这个method6没有static没有报错,而method4有所以报错了)
验证猜想1:直接在子类中用static修饰实现method4
猜想1验证结果总结:反正我觉得我说的没毛病,有的话你们直接说。我改!
好了,最后进行数据输出,看看这几个方法到底是啥样的结果
很不幸,这里报错了:至于为啥我仔细想了下,两个接口中的method3和method4。猜想是method3在两个接口中均为static,实现类不知道调用哪个,不验证了,反正我猜的。所以只能类名调用。
package interfacetest;
/**
* @author liuxx
* @date 2021/1/19 17:02
*/
public class Main {
public static void main(String[] args) {
InterfaceImpl impl = new InterfaceImpl();
impl.method();
impl.method2();
Interface01.method3();
Interface02.method3();
impl.method4();
impl.method5();
impl.method6();
}
}
输出结果如下
InterfaceImpl method
InterfaceImpl method2
Interface01 static method3
Interface02 static method3
Interface01 default method4
Interface01 default method5
FatherClass public method6
结果论证了啥
输出值 | 说明 |
---|---|
InterfaceImpl method | 直接实现接口声明的普通方法,因为接口没有实现,所以只能是实现类的方法 |
InterfaceImpl method2 | 直接实现接口声明的default方法,所以是实现类的方法 |
Interface01 static method3 | 没有意义直接类名调用的 |
Interface02 static method3 | 没有意义直接类名调用的 |
Interface01 default method4 | 不实现的方法直接调用,调用的是default方法而不是static修饰的 |
Interface01 default method5 | 好像没有证明啥,难道是我傻了? |
FatherClass public method6 | 接口default修饰的方法和父类中同名的方法,调用的是父类的 |
FatherClass static method7 | ,如果父类和接口都定义了静态方法,如果通过是实现类调用的话调用的是父类的方法(证明在最后) |
然后我又猜想method4是不是因为实现的顺序不一样才导致调用的是Interface01的方法.于是再来一遍
换下位置,然后输出还是一样的
InterfaceImpl method
InterfaceImpl method2
Interface01 static method3
Interface02 static method3
Interface01 default method4
Interface01 default method5
FatherClass public method6
然后我又想确定下如果都是static的方法,在父类和接口中都有,那么会如何调用呢
执行结果说明了啥?
:::如果父类和接口都定义了静态方法,如果通过是实现类调用的话调用的是父类的方法
中间还有一些逻辑缺陷,但是我想不到了,我记得看过一句话如果你觉得你写的代码有问题,那其中肯定是存在问题的
欢迎大家指正!感激!