Java中的方法覆盖 - 将子类对象分配给父类变量

时间:2015-09-04 01:50:41

标签: java inheritance method-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的新手。请帮我理解这一点。

4 个答案:

答案 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");
    }
}

因此,您需要为要设置的内容构建字段,并且需要为要创建/定义的对象添加构造函数。希望这有帮助