Java持有对象的超类的类型

azu*_*ela 2 java inheritance

我有两个类动物和狗.因为你可以从动物身上延伸出来.我可以毫无问题地编写这些类,但我注意到我可以像这样创建一个新的dog对象:

Dog firstDog = new Dog("rocky");
Run Code Online (Sandbox Code Playgroud)

没关系,但是当我尝试创建这样的新实例时:

Animal secondDog = new Dog("alex");
Run Code Online (Sandbox Code Playgroud)

没有任何错误,但我无法访问我在Dog类中编写的任何字段或方法,即使它们是公共的,所以如果我想在一个类型与其超类的类型相同的变量中保存一个对象,我可以到达字段和仅实现超类的方法(对于此示例名称,颜色,setColor()和toString()),并且没有任何方法可以访问在子类中实现的字段和方法.我是否正确理解当我尝试调用secondDog的toString()函数时它调用我在Dog类中编写的方法,我知道我在Dog类中重写了这个函数但是我无法达到我在Dog类中实现的其他方法.java如何处理这些?

动物类:

public class Animal {
    private String name;
    private String color;

    public Animal(String name){
        this.name=name;
    }

    public void setColor(String color){
        this.color=color;
    }

    public String toString(){
        return"Hi, my name is " + this.name + ". I'm " + this.color;
    }
}
Run Code Online (Sandbox Code Playgroud)

狗类:

public class Dog extends Animal {
    private int age;
    public Dog(String name){
        super(name);
        setColor("gray");
        this.age = 7;
    }
    public String speakDog(){
        return"wof!";
    }
    public String toString(){
        return super.toString() + " and I " + speakDog();
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*460 7

当你写这个:

Animal secondDog = new Dog("alex");
Run Code Online (Sandbox Code Playgroud)

你告诉Java secondDog是一个Animal,就是这样.您被允许分配DogAnimal引用的原因Dog是因为Animal它是子类,因此它是允许的.

但是,secondDog明确表示Animal只能访问Animal类中的属性和行为.

要访问属性和行为Dog,您需要将其强制转换:

((Dog)secondDog).speakDog();
Run Code Online (Sandbox Code Playgroud)

把它投入Dog就像告诉Java:"嘿,相信我.这个对象是一只狗".

现在只有更具体,您才可以访问狗的属性.(如果没有,它仍然被视为动物(更高级)).

但是,如果将它强制转换为不是子类的类Animal,则会得到一个ClassCastException.


在本质上,

  • 如果secondDog保持为Animal(不被转换为Dog),它只能访问所有非私有字段和方法Animal.

  • 如果secondDog被转换为Dog,它可以从Animal 加上所有非私有字段和方法访问所有继承的字段和方法Dog.