【问题标题】:Are Interfaces "Object"? [duplicate]接口是“对象”吗? [复制]
【发布时间】:2012-07-08 11:05:54
【问题描述】:

可能重复:
Do interfaces inherit from Object class in java

package inheritance;
class A{
   public String display(){
       return "This is A!";
   }
}

interface Workable{
   public String work();
}

class B extends A implements Workable{
   public String work(){
      return "B is working!";
   }
}

public class TestInterfaceObject{
   public static void main(String... args){
      B obj=new B();
      Workable w=obj;
      //System.out.println(w.work());
      //invoking work method on Workable type reference

      System.out.println(w.display());
      //invoking display method on Workable type reference

      //System.out.println(w.hashCode());
      // invoking Object's hashCode method on Workable type reference
    }
}

我们知道可以调用的方法取决于我们要调用的引用变量的类型。在这里,在代码中,work() 方法是在“w”引用(它是 Workable 类型)上调用的,因此方法调用将成功编译。然后,在 "w" 上调用 display() 方法,这会产生一个编译错误,表明未找到显示方法,这很明显,因为 Workable 不知道它。然后我们尝试调用 Object 类的方法,即 hashCode() ,这会产生成功的编译和执行。这怎么可能?有什么合乎逻辑的解释吗?

【问题讨论】:

  • Java 中的所有对象都是Object。这可能就是为什么它无论如何都可以调用Object 的方法。我认为有人会引用标准来正确回答问题。
  • 在对象上将调用哪些方法取决于引用该对象的引用类型。在这里,Workable 类型引用是指对象,而 Workable 类型引用是如何知道 Object 类的方法的?
  • 因为一切都是Object(原始类型除外),所以引用的类型并不重要。我想这就是它的工作原理。

标签: java oop inheritance object interface


【解决方案1】:

w.display() 不起作用的原因是您将引用保存为您的接口类型。编译器只看到接口公开的方法。如果您要致电((B)w).display(),这将起作用。您可以调用hashCode(),因为编译器足够聪明,知道接口是由对象继承的,并且所有对象的超类都是Object

【讨论】:

  • 那是hashCode(),而不是getHashCode()。不过,它是 C# 中的 GetHashCode()
  • 我在混合语言时遇到问题
  • 我也经常遇到这种情况。只是注意到它。 :)
【解决方案2】:

直观的答案是,无论你引用什么接口,实现该接口的对象都必须是Object的子类。

JLS 的第 9.2 节专门定义了这种行为:http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.2

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

即假定所有接口都包含与Object 类中的方法相对应的方法签名。

【讨论】:

  • +1 用于链接到 JLS。 :)
  • 谢谢。我想从 JLS 中添加更多内容。如果在 Object 中将 m 声明为 final 的情况下,接口显式声明了这样的方法 m,则会出现编译时错误。如果接口声明的方法具有与 Object 的公共方法重写等效(第 8.4.2 节)的签名,但具有不同的返回类型或不兼容的 throws 子句,则会出现编译时错误。这解释了现在的一切。 :)
  • 这个答案是否也适用于abstract class{},我的意思是abstract class 是否隐式声明了一个公共抽象成员方法 m,其签名为 s,返回类型为 r,并抛出对应于每个公共实例的子句 t方法 m 带有签名 s,返回类型 r,并在 Object 中声明的 throws 子句 t 或 abstract class 是否继承了 class Object 的实现?
【解决方案3】:

我认为这里发生的情况是,即使 w 只知道是 Workable,所有对象都必须派生自 Object,所以无论 w 最终是什么类,它都必须具有 @987654325 @ 方法。

【讨论】:

  • 在对象上调用什么方法取决于引用该对象的引用类型。在这里,Workable 类型引用是指对象,而 Workable 类型引用是如何知道 Object 类的方法的?
  • 因为接口就是类,Java中的所有类都继承自java.lang.Object。所以一个可行的是一个对象。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2019-10-16
  • 2020-08-26
  • 2011-06-27
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多