java编译器如何知道继承的方法?

Chi*_*led 7 java compiler-construction inheritance

我们在Java中使用继承来抽象出超类中的类似行为,并让所有子类继承它.这样做的一个优点是,我们现在只有一个要维护的方法副本(即在超类中).

Class Animal
{
   public void makeNoise()
   {

   }

   public void sleep()
   {

   }   
} 

Class Cat extends Animal
{
     // Override the makeNoise method
     public void makeNoise()
     {

     }
}

Class someClass
{
     public static void main(String args[])
     {
          Cat fluffy = new Cat();

          fluffy.sleep();
     }
}
Run Code Online (Sandbox Code Playgroud)

我试图了解Java编译器如何知道类型引用的sleep()方法Cat.在Cat子类中不能有方法的副本(它违背了在超类中使用它并让所有子类继承它的目的).这些信息是否存储在其他地方?

Jas*_*zun 9

当编译器看到fluffy.sleep()它时,首先在Cat类中查找名为sleep不带参数的公共实例方法.由于它没有找到它,它向上移动继承链Animal,并进行相同的检查Animal.它找到了它,所以一切都很好.

除了代码之外,这些信息并没有真正"存储"在任何地方,然后是Java字节代码.

  • @Twister是的,我刚刚用"是"回答了编译时的问题.我可以通过说,当编译器查看代码时,它们确实形成代码定义的类型树,以便在编译其余代码时,它知道所有类型的内容.否则,它不知道什么是未定义的引用,什么不是. (2认同)