【问题标题】:Rationale for superclass reference to subclass object calls overriden method in subclass超类引用子类对象调用子类中的覆盖方法的基本原理
【发布时间】:2021-03-05 11:05:00
【问题描述】:

示例取自here

class Human{  
   //Overridden method  
   public void eat()  
   {  
      System.out.println("Human is eating");  
   }  
}  
class Boy extends Human{  
   //Overriding method  
   public void eat(){  
      System.out.println("Boy is eating");  
   }  
   public static void main( String args[]) {  
      Boy obj = new Boy();  
      //This will call the child class version of eat()  
      obj.eat();  
   }  
}  

如果我们现在创建一个带有 Human 引用的 Boy 对象:

Human boy = new Boy();

然后打电话

boy.eat()

为什么它从 Boy 类调用 eat() 而不是从 Human 类调用 eat()。我知道当使用 Human 引用变量时,不能使用 Boy 类的方法。那么为什么 boy.eat() 不从 Human 类中调用 eat() 呢?

【问题讨论】:

  • 动态绑定和多态性。

标签: java inheritance polymorphism


【解决方案1】:

因为 boy 是 Human 类型的引用变量,其值是 Boy 类型的对象。

Human boy; // create a reference variable of type Human
boy = new Boy(); //  whose value is an object of type Boy

调用的正确方法是在运行时根据引用的对象决定的:

  • 编译器知道男孩的类型是 Human,因此它会检查 Human 是否有一个 eat() 方法
  • 在运行时,JVM发现boy的值为new Boy(),于是调用Boy的eat()方法

【讨论】:

  • 谢谢!以这种方式设计的基本原理是什么?为什么要限制超类的可用方法,除了那些被覆盖的方法?有好的例子吗?
  • 这叫多态,是Java的精髓。我无法在这里解释这个基本的事情,并且网络上到处都是解释。但是一个例子可能是 Human 类中的方法 Breath(),每当对象类型(男孩、婴儿、青少年或成人)时调用,因此不会被覆盖。
  • 是的,我明白这一点。我不明白的是为什么使用超类的引用变量时可用方法的限制只适用于未被覆盖的方法。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2021-09-19
  • 2016-01-27
  • 1970-01-01
  • 2020-02-15
  • 2017-08-27
相关资源
最近更新 更多