java - Java中的方法重写-将子类对象分配给父类变量

标签 java inheritance overriding

class Person{
    String name;

    void show(){
        System.out.println("I am parent");
    }
}

class  Student extends Person{
    String dit;

    void show(){
        System.out.println("I am child");
    }
}

public class NewClass {
    public static void main(String[] args) {
        Person p;
        p = new Student();

        p.name = "Kamal";
        p.dit = "DIT/10/c1/1234"; // I'm not allowed to do this 
        p.show(); // Here in overriding child class method is called
    }
}

我很困惑。据我了解,“p”变量无法访问 dit(即使它是用 Student 分配的),因为 p 的数据类型是 Person,它是父类。因此父类不能访问子类的属性和方法。但在重写它时调用子类方法。

我是java新手。请帮助我理解这一点。

最佳答案

这称为运行时多态性

JVM 在运行时根据对象的内容而不是对象的类型决定调用哪个方法。

您显然无法访问dit,因为对象的类型不支持它。 show 方法是可访问的,因为它是父类和子类的一部分

更多详情here

这是一个经典的例子

class Animal {
  void whoAmI() {
    System.out.println("I am a generic Animal.");
  }
}
class Dog extends Animal {
  void whoAmI() {
    System.out.println("I am a Dog.");
  }
}
class Cow extends Animal {
  void whoAmI() {
    System.out.println("I am a Cow.");
  }
}
class Snake extends Animal {
  void whoAmI() {
    System.out.println("I am a Snake.");
  }
}

class RuntimePolymorphismDemo {

  public static void main(String[] args) {
    Animal ref1 = new Animal();
    Animal ref2 = new Dog();
    Animal ref3 = new Cow();
    Animal ref4 = new Snake();
    ref1.whoAmI();
    ref2.whoAmI();
    ref3.whoAmI();
    ref4.whoAmI();
  }
}
The output is

I am a generic Animal.
I am a Dog.
I am a Cow.
I am a Snake.

关于java - Java中的方法重写-将子类对象分配给父类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32388903/

相关文章:

java - CardLayout - 如何使用 NetBeans GUI Builder 使用 previous() 和 next()?

C++ 继承 : protected variables not available

java - 抽象类中的同步

java - OOPS概念调用父类而不是子类的函数

java - 当使用 lambda 并抛出覆盖异常时,“覆盖方法不会抛出异常”

java - 使用Intstream生成无限斐波那契数列

java - Comparator.nullsLast 与 Comparator.comparingInt

java - Tomcat8:404 错误,尽管 webapp 文件夹存在(dspace 实例)

javascript - 主干 View 属性 : one on instance, 是原型(prototype)上的一个吗?

user-interface - 如何在用户 Plone 中插入生日?