父类对象被赋予子类对象时会发生什么?

时间:2017-10-07 22:31:00

标签: java inheritance polymorphism parent-child

以下代码将输出显示为:

Output:
  Animal
  Dog
  Animal

我很困惑为什么“a.type”即使在赋值“a = b”之后输出为“Animal”。为什么会这样?

另一个观察是我在Dog类中没有声明变量 - “String type”。然后我得到输出:

    Output:
      Dog
      Dog
      Dog

我的代码:

    //Parent class
    class Animal {
        String type;
        public Animal(){
           this.type= "Animal";
       }

    }

    //Child class
    class Dog extends Animal {

       String type;
       public Dog(){
           this.type ="Dog";
       }

    }

    //Main Class To Test
    class TestDog{


          Animal a = new Animal();   
          Dog b = new Dog();        
          Animal c = new Dog();     

          a = b;
          System.out.println(a.type);
          System.out.println(b.type);
          System.out.println(c.type);


    }

1 个答案:

答案 0 :(得分:0)

首先是一个教学点。你在你的瓷砖中陈述:

  

为父类对象分配子类对象会发生什么?

请理解您正在将子类对象分配给父类型变量。这可能看起来很挑剔,但它是一个重要的区别,并且涉及Java如何实现OOP并使用引用变量的核心。父类型甚至可能不是一个类,但可以是一个接口("纯"类型)。

至于你的困惑,你要在父类和子类中添加一个类型字段。不要,因为田地没有被覆盖。仅将其添加到“父级”。保护它或给它吸气剂和制定者。

例如:

class Animal {
    private String type;

    public Animal() {
        this.type = "Animal";
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

}

// Child class
class Dog extends Animal {

    String type;

    public Dog() {
        setType("Dog");
    }

}

// Main Class To Test
class TestDog {
    public static void main(String[] args) {

        Animal a = new Animal();
        Dog b = new Dog();
        Animal c = new Dog();

        a = b;
        System.out.println(a.getType());
        System.out.println(b.getType());
        System.out.println(c.getType());
    }

}