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/