从内存认识对象转型
2018-10-30 本文已影响0人
Rimson
class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
public String furColor;
public Dog(String name, String color) {
super(name);
this.furColor = color;
}
}
这里有基类Animal和子类Dog,现在执行下列代码:
Animal a = new Dog("bigyellow", "yellow");
Dog d1 = (Dog) animal;
在这种情况下,a是无法直接访问color字段的,而d1可以。
那么问题来了:
a无法访问color字段,但是向下转型之后可以,那么a的color保存在哪里呢?
直接上图:
指向Dog实例对象的引用对象animal是一个Animal类型的引用类型,如果Animal类型指向了Dog对象,程序会把它当作一只普通的Animal而不是Dog(也就是黄色箭头所指)。因此,a只能看到子类对象中的父类对象,因此只能访问name属性。但是furColor属性是存在的,只不过不能访问。
总结
父类引用指向子类对象的时候,它看到的只是作为父类的那部分所拥有的属性和方法,至于作为子类的那部分它没有看到。