我从Oracle docs获得了以下信息:
如果接口没有直接的超接口,那么接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型为r, throws在Object中声明的子句t,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。
有人可以告诉我接口如何能够隐式地将公共抽象方法声明为每个公共实例方法,这些方法在Object类中不是最终可用的吗?
interface Test {
public void functionA();
}
class child implements Test{
public void functionA() {
}
public static void main(String[] args) {
Test test = new child();
test.toString(); // since toString is Objects class method, How it's visible for Test interface ref?
}
}
答案 0 :(得分:2)
接口如何能够隐式地将公共抽象方法声明为每个公共实例方法,这些方法在Object类中不是最终可用的?
界面无法做到这一点 - 只有具体的对象才可以。我的猜测是你正在查看显示从接口创建匿名内部类的代码,并认为这是接口的实例化 - 但它不是。相反,它是一个具体的类,一个没有名称,实现接口,从Object 扩展,就像所有具体的类一样。
现在我不太确定这个编译:
public interface MyInterface {
void foo();
@Override
String toString();
@Override
boolean equals(Object o);
}
正确的答案可能是:因为这就是Java的作者所希望的。
答案 1 :(得分:1)
Interface如何访问Object类方法?
与往常一样,答案在JLS中:
4.10.2。类和接口类型之间的子类型
给定非泛型类型声明C,类型C的直接超类型是以下所有:
- C的直接超类(§8.1.4)。
- C(§8.1.5)的直接超接口。
- 类型Object,如果C是没有直接超接口的接口类型(第9.1.3节)。
所以第3点回答你的问题。作为Object
的子类型,接口继承其方法。
注意:对于通用接口也是如此(在4.10.2的其余部分中进行了解释)。