【问题标题】:Accessing the java Object class methods using an interface reference使用接口引用访问 java Object 类方法
【发布时间】:2013-10-19 18:09:36
【问题描述】:

让我们考虑下面的例子。

public interface SimpleInterface {
    public void simpleMethod();
}

public class SimpleClass implements SimpleInterface{

 public static void main(String[] args) {
     SimpleInterface iRef = new SimpleClass();
     SimpleClass cRef = new SimpleClass();
     iRef.simpleMethod(); // Allowed. Calling methods defined in interface via interface reference.
     cRef.specificMethod(); // Allowed. Calling class specific method via class reference.
     iRef.specificMethod(); // Not allowed. Calling class specific method via interface reference.
     iRef.notify(); // Allowed????

 }

 public void specificMethod(){}

 @Override
 public void simpleMethod() {}

}

我认为,在使用接口引用的 Java 中,我们只能访问在此接口中定义的方法。但是,似乎允许通过任何接口引用访问类 Object 的方法。我的具体类“SimpleClass”继承了 Object 类拥有的所有方法,并且 Object 类肯定没有实现任何接口(人们会假设 Object 实现了一些带有通知、等待等方法的接口)。我的问题是,为什么允许通过接口引用访问类 Object 的方法,考虑到我的具体类中的其他方法是不允许的?

【问题讨论】:

    标签: java inheritance interface


    【解决方案1】:

    为什么允许通过接口引用访问Object类的方法

    您可以使用接口引用调用Object 类方法,尽管接口不是从Object 类扩展的,因为Java 中的每个根接口都隐含地声明了与Object 类的每个方法相对应的方法。

    JLS §9.2 - Interface members

    接口的成员是:

    • 如果接口没有直接的超级接口,那么接口 隐式声明一个带有签名的公共抽象成员方法 m s,返回类型 r,以及每个 public 对应的 throws 子句 t 具有签名 s、返回类型 r 和 throws 子句 t 的实例方法 m 在 Object 中声明,除非方法具有相同的签名,相同 返回类型,并且兼容的 throws 子句由 界面。

    【讨论】:

    • 谢谢。我认为这是可以接受的答案。所以,这意味着在 Java 中,任何接口都有 Object 类的“隐藏声明”方法,对吗?
    • @sergeyan 是的。没错。
    【解决方案2】:

    这是因为Java保证任何实现了X接口的类也肯定是Object类,所以这可以调用wait()notify()等Object类。

    【讨论】:

    • OP关心的是接口引用访问Object类方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多