为什么我可以通过没有定义它们的接口访问Object的方法?

cha*_*had 2 java

给定以下接口和实现类:

public interface MyInterface {
  public String getSomething ();
}

public class MyImplementation implements MyInterface {

   @Override
   public String getSomething () {
      return "Someting";
   } 

   public String getOtherThing () {
      return "otherThing";
   }
}
Run Code Online (Sandbox Code Playgroud)

然后是一些客户端代码:

MyInterface objectViaMyInt = new MyImplementation();

objectViaMyInt.getSometing();   //WORKS, OF COURSE
objectViaMyInt.getOtherThing(); //DOESNT WORK, OF COURSE
objectViaMyInt.toString();      // WORKS TOO
Run Code Online (Sandbox Code Playgroud)

所以,我想我理解这一点的精神...每个对象都是一个对象,应该继承那些必要的方法.但这实际上是如何运作的呢?它似乎无法遵循继承和基于接口(类型)的访问的常规规则...

Jon*_*eet 11

但这实际上是如何运作的呢?

在语言级别,它的工作原理是因为JLS第9.2节说它确实:

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

在JVM级别,JVM可以只使用接口的每个实例显然必须是对象的知识,因此它可以以正常方式获得正确的成员实现.

  • +1你怎么能找到这么大的JLS中的任何段落,哪个太快了?:) (3认同)