【问题标题】:Why would we need to allow interfaces to extend only from java.lang.Object and not any other class? [duplicate]为什么我们需要允许接口仅从 java.lang.Object 扩展而不是任何其他类? [复制]
【发布时间】:2016-02-22 21:52:21
【问题描述】:

根据我从一些 Java 书籍中的理解,接口不能 扩展类。

但是所有接口都继承了 Object 类的方法。为什么是这样 所以呢?

如果接口不是从对象类扩展而来。那么这段代码是如何工作的呢?

interface A
{    
 public boolean equals(Object o);

}

class InterfaceAndObjectClass
{

    public static void main(String[] args)
    {
        A a = null;

        a.equals(null);

        a.hashCode();

        a.toString();
    }
}

请帮我解释一下如何在Interface中访问Object类方法。

【问题讨论】:

    标签: java oop inheritance interface extends


    【解决方案1】:

    一个接口隐式包含Object类的所有方法。由于任何实现该接口的类都是Object 的子类,因此它包含所有这些方法的实现。

    JLS 9.2

    如果一个接口没有直接的超接口,则该接口隐式声明一个公共抽象成员方法 m,签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s,返回类型为 r 的公共实例方法 m,并且在 Object 中声明的 throws 子句,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的抽象方法。

    【讨论】:

    • 所以你可以说接口未扩展隐含包含对象类的所有方法?你能解释一下接口中隐含的包含 Object 类的方法吗?谢谢
    • @Z.I.J “隐含”是指就编译器而言,任何不扩展其他接口的接口都声明了Object类的所有方法。
    • 抽象类扩展了 Object,您不能在它们上调用 new 运算符。因此,即使接口扩展了 Object(它们没有),这并不意味着您可以实例化它们。
    • @Z.I.J 我不明白你在上一条评论中想说什么,以及它与我的回答有何关系。
    • @Eran 根据你提到的JLS 9.2,它没有说接口有父类是对象,它说接口将隐含对象类的方法,如果我请纠正我我错了。
    【解决方案2】:

    Eran 是绝对正确的。实际上 Interface 没有扩展或实现 Object 类。它隐式包含 Object 类的所有方法。 注意(进一步):

    如果您声明相同的(抽象)方法(具有相同的名称签名、返回类型和 throws 类型,编译器会将其视为覆盖(没问题)但如果您声明了不同的返回类型或不同的 throws 类型,编译器将强制您保持相同(兼容)的返回类型或 throws 子句。

    尝试在你的界面中声明下面的 equals 方法。 public int equals(Object obj); //它会显示编译时错误返回类型是 //不兼容。 (它应该是布尔值而不是整数)

    【讨论】:

    • 为什么在Interface中隐式Object类方法以及将方法放入Interface的机制是什么?
    • 因为您的接口将引用一个实现您的接口的对象。这个对象将继承 Object 类的所有实例方法,因此这些方法可以在您的接口中使用,以便您也可以通过接口引用调用它们。
    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多