“父类的引用指向子类的对象”怎么理解?

这是JAVA和.NET都有的一句经典的语句?谢谢各位能详细的说说。 谢谢了!!!

父类引用指向子类对象,也就是向上转型upcasting, 向上转型概念是:把子类对象当做父类对象来使用, 两个类Animal(动物)和Dog(狗),Dog从Animal继承,Animal是父类,Dog是子类,现在我在main方法中这样写: Animal a = new Dog(); main方法开始执行后,栈内存中分配一个父类Animal的引用变量a, new了一个子类Dog的对象位于堆内存,现在a这个引用变量指向了这个对象,这就是 父类引用指向子类对象! 子类的构造过程中要先构造父类对象,在堆内存的这个子类对象Dog的内部有一个父类Animal对象,所以 可以说子类对象比父类对象大,子类对象里面包含了一个父类对象,这就是有继承关系存在的情况下,你实例化一个子类对象时,内存中的情况. 现在Animal a = new Dog(); 向上转型, 通过引用a我只可以访问父类对象的内容(属性和方法),我不能访问Dog这个子类对象自己定义的特有的内容, 你虽然在内存中确实是一个子类Dog对象,但是我父类引用指向了你,你虽然确实是一只狗,但是我就把你当成是动物看!怎么地吧! 说白了我这个Animal引用a指向你Dog对象,但是我只能看到位于子类对象里面的那个父类对象, 所以,正是因为基类不会大于导出类的接口,所以向上转型是安全的! 另外,父类引用指向子类对象是多态的3个必要条件之一 举个例子: void run(Animal a) { } 方法run的参数是Animal类型, 当我调这方法的时候, Dog d = new Dog(); run(d); 这就是父类引用指向子类对象,人家要求一个动物,我往里仍只狗进去,可以,没问题.
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-10-25
就是多态问题 比如有个Person类,有个Eat()方法,子类有Teacher,Student,重写了基类的Eat()方法 声明一个Person[] ps={new Teacher(),new Student}; 当用循环调用时 foreach(Person p in ps) { p.Eat(); } 其中p在运行时就分别指的是new Teacher()和new Student()两个子类对象实例本回答被提问者采纳
相似回答