【问题标题】:Does an interface by default extend Object? [duplicate]默认情况下接口是否扩展对象? [复制]
【发布时间】:2012-11-26 09:28:20
【问题描述】:

如果你定义一个像下面这样的接口

interface I1{

}

在任何代码部分你都可以这样写

I1 i1;
i1.equals(null);

那么equals方法从何而来,接口是否也扩展了超类Object?如果是这样,接口如何扩展一个类?

假设让接口扩展超类 Object ,那么如果你明白为什么像 Set 这样的集合接口定义了 equals() 和 hashCode() 方法?所有类都扩展了 Object 类,因此如果您在 Object 类中存在的接口中定义任何抽象方法,那么实现该接口的人无需实现这些方法。就像下面的代码

interface I1{
String toString();
}

class A implements I1{

}

这里的类 A 不需要实现方法 toString() ,因为它存在于 Object 类中。 那么在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类来实现这些方法。

【问题讨论】:

    标签: java


    【解决方案1】:

    那么equals方法从何而来,接口是否也扩展了超类Object?如果是这样,接口如何扩展一个类?

    Java 语言规范明确地处理了这个问题。

    来自section 9.2

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

    基本上,这是为了让您可以使用equalshashCode 等 - 因为指定 Java 语言的方式意味着接口的任何具体实现都将 是一个类,而该类必须最终是Object 的子类,所以成员肯定会出现。

    换句话说,虽然接口本身没有扩展Object,但众所周知,任何实现都会。

    这里的类 A 不需要实现方法 toString() ,因为它存在于 Object 类中。那么在集合接口中定义这些方法的目的是什么,因为它们不能强制实现类来实现这些方法。

    通常这只是为了清楚起见,例如根据Object 中声明的成员记录对实现的预期。

    【讨论】:

    • 非常感谢所以我们可以说interfcae没有扩展对象类,我关于Set interface的第二个问题的答案是什么,为什么他们定义了这些方法。
    • @KrushnaCh.Dash:见我回答的结尾。 Set.hashCodeSet.equals 的文档提供了有关预期行为的更多详细信息。
    【解决方案2】:

    每个类都隐式扩展Object,因此继承了 Object 类的每个(非私有)方法。

    每个实例都有一个类,因此拥有 Object 的所有方法。

    实例是否实现接口与这一点完全无关。

    对象是一个类,接口不能扩展类,所以“不”——接口不从任何类继承任何东西。

    【讨论】:

    • 好吧,OP 说的是接口。
    • @RohitJain 现在好点了吗?我以为我在白天
    【解决方案3】:

    Java 接口不扩展 java.lang.Object 类,但实现该接口的对象实例扩展 Object 类,否则如果 Java 接口允许扩展 java.lang.Object 类,那么 Java 将支持它不支持的多重继承它的语言规范。

    考虑以下场景:

    interface MyInterface
    { 
       // interface methods here
    }
    MyClass extend java.lang.Object implements MyInterface
    { 
       // override methods or interface method implementations
    }
    

    现在如果 MyInterface 扩展 java.lang.Object 类,那么这意味着 MyClass 也将通过构造创建多重继承来扩展 MyInterface 接口。因此,Java 接口不扩展 java.lang.Object 类是有道理的,因为这会由于多重继承而造成混乱。

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2015-06-22
      • 2014-07-14
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多