从内存认识对象转型

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属性是存在的,只不过不能访问。

总结

父类引用指向子类对象的时候,它看到的只是作为父类的那部分所拥有的属性和方法,至于作为子类的那部分它没有看到。

上一篇下一篇

猜你喜欢

热点阅读