这三中声明方式有什么区别吗?
Object obj=new Object (); 和
subclass obj = new subclass();和
Object obj=new subclass ();
//其中subclass是OBject的子类
请高手帮我讲下他们的基本原理,越详细越好
[解决办法]
Object obj=new Object (); //一般的初始化
subclass obj = new subclass();//一般的初始化
Object obj=new subclass ();//向上转型
向上转型:
它是一个编译是为父类对象,但运行却是一个子类对象,具体特征如下.
1.被声明为父类对象
2.拥有父类属性
3.占用子类的内存空间
4.子类方法覆盖父类的方法时,此时对象调用的是子类的方法;否则,自动调用继承父类的方法.
5.我人认为这个对象既不是父类对象,也不是子类对象.当我们用到它的方法时,
我便把它看成子类对象;若用到它的属性时,我把它看成父类对象.
它是一个占用父类属性,而使用子类方法的对象.至于到底是什么对象,我认为还是得根据声明来,它应算是父类对象,但拥有子类方法.
这时候子也就是子类向上转型。
[解决办法]
Object obj = new Object();
______________
________ | |
| obj | --> | Object实例 |
^^^^^^^^ | |
^^^^^^^^^^^^^^
你可以通过obj来访问Object类的一些方法或属性。
subclass obj = new subclass();
______________
________ | |
| obj | --> | Object实例 |
^^^^^^^^ | |
|````````````|
|subclass扩展|
^^^^^^^^^^^^^^
可以通过obj来访问右边这个subclass类的实例的方法或属性,
包括Object原有的和subclass扩展的。但如果subclass中有和Object
中重复的属性或方法,访问的将是subclass的,而不是Object的。
Object obj = new subclass();
______________
________ | |
| obj | --> | Object实例 |
^^^^^^^^ | |
|````````````|
|subclass扩展|
^^^^^^^^^^^^^^
这个图和上个图相同,但obj这个实例引用的类型却不同。obj此时是Object的引用类型。
虽然它也指向一个subclass类的实例。但由于只能通过obj来访问,而obj的类型是Object引用。
所以也只能访问Object所拥有的方法或属性。同样,如果subclass中包含Object中相同的方法或属性,通过obj调用的是subclass的方法行为或属性。
这种向上转换,丢失了类型信息,当然也就丢失了subclass对Object的扩展信息。