java如果我在接口和抽象类中使用相同名称的方法,我就无法理解超类、接口和子类之间的关系
public interface Pet { // Pet Interface
default void introduce() {
System.out.println("Interface");
}
}
abstract public class Animal {
public void introduce() {
System.out.println("Animal class");
}
}
public class Dog extends Animal implements Pet{}
现在,当我在Dog
上调用introduce
方法时,实际发生了什么
# 1 楼答案
默认方法总是“最后一行”。如果类链层次结构中的任何方法(在这里,顶部是“Dog”,然后是Animal,然后是Object——这些都是层次结构中涉及的类)匹配,那么总是获胜
只有在整个类链中找到零个方法,并且接口链正好包含一个带有默认实现的方法时,才选择该方法。如果有多个方法,那么您的代码将无法编译(如果您有
class A implements B, C {}
,并且B
和C
都定义了相同的方法,并且都有一个默认的impl,那么如果不将该方法显式写入a,就无法编译a