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的新手。请帮我理解这一点。
答案 0 :(得分:1)
这称为运行时多态。
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.
答案 1 :(得分:0)
在运行时,Java意识到p
实际上是Student
,并且它看到Student
已覆盖show()
,因此它调用了而是show
中的Student
方法。
答案 2 :(得分:0)
没有能力从其父级访问子类的成员。 在您的情况下,如果要访问dit变量,则必须将p对象转换为Student。
((Student)p).dit = "DIT/10/c1/1234";
答案 3 :(得分:-1)
您尚未定义类Person。您尝试创建新对象(p)然后尝试定义名称但没有setter或getter。
class Person{
String name;
public Person( string name ){
setName; }
public void setName(){this.name = name: }
public void getName(){ return name; }
void show(){
System.out.println("I am parent");
}
}
class Student extends Person{
String dit;
public void setDit() {this.dit = dit; }
public void getDit() { return dit; }
void show(){
System.out.println("I am child");
}
}
因此,您需要为要设置的内容构建字段,并且需要为要创建/定义的对象添加构造函数。希望这有帮助