锁定老帖子 主题:上转型对象 - 平时没有注意的地方
精华帖 (0) :: 良好帖 (5) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-14
最后修改:2011-01-15
多态性三种表现形式: 1. 类多态(通过继承实现) 2. 方法多态(方法重写,方法重载: 通过参数列表个数,类型不同来区分) 3. 动态连接(定义接口,然后声明上转型对象来实现) 上转型对象是将子类的对象赋值给父类的引用,形如: SuperClass sup = new SubClass(); 是类多态性的一种表现形式(动态连接).
上转型对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.
我的误区:原来一直认为上转型对象无论是成员变量,还是成员方法都是优先访问子类的.如果子类覆盖了父类的成员变量,则上转型对象一定是访问子类覆盖父类的成员变量(子类中的成员变量),而不是访问父类中的成员变量.
因为JavaBean的广泛应用,平时在做Java程序的时候,因为一个读写权限的问题,常常不会对变量直接操作,而是通过成员变量的get,set方法间接操作成员变量.所以很自然错误地理解上转型对象操作变量与调用方法是类似的.
举例:
/* @author jarg @TODO 上转型对象测试 */ class SuperClass { String str = "super"; void display() { System.out.println("super class: " + this.toString()); } } class SubClass extends SuperClass { String str = "sub"; void display() { System.out.println("sub class: " + this.toString()); } } public class Client { public static void main(String[] args) { SuperClass sup = new SubClass(); System.out.println("sup.str=" + sup.str); sup.display(); } }
如上代码中,sup.str访问的是父类的变量,输出sup.str=super;而sup.display()输出subclass: SubClass@1fb8ee3. 可见,不管子类有没有覆盖父类的成员变量,SuperClass的引用都是访问父类的成员变量str=super.而被调用的display()方法显然是子类中的方法.
个人认为这跟数据在存储方法的差别导致了这种现象,由于本人水平有限,分析暂时到此.
分析不对的地方,大家给指正,谢谢. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-15
这是因为Field没有覆盖引起的。
只有动态方法才有override,静态方法,静态域,动态域都是不会被覆盖的。 |
|
返回顶楼 | |
发表时间:2011-01-15
最后修改:2011-01-15
苍山洱海 写道 这是因为Field没有覆盖引起的。
只有动态方法才有override,静态方法,静态域,动态域都是不会被覆盖的。 谢谢,受教了~ 我刚才在网也查了下.现在算是明白了. 确实只有动态方法能被重写(rewrite). |
|
返回顶楼 | |
发表时间:2011-01-15
苍山洱海 写道 这是因为Field没有覆盖引起的。
只有动态方法才有override,静态方法,静态域,动态域都是不会被覆盖的。 不知道能否告诉我是因为什么导致这么差别的? 虚拟机是怎么处理的? 会不会跟变量,方法在内存中存储方式相关哦? |
|
返回顶楼 | |
发表时间:2011-01-15
java的机制
|
|
返回顶楼 | |
发表时间:2011-01-15
weilingfeng98 写道 java的机制
谢谢你的回复... 嗯...我知道是java的机制. 我想知道这个机制的过程,具体是怎么做... 想多了解一点. |
|
返回顶楼 | |
发表时间:2011-01-15
yeshaoting 写道 weilingfeng98 写道 java的机制
谢谢你的回复... 嗯...我知道是java的机制. 我想知道这个机制的过程,具体是怎么做... 想多了解一点. 《深入java虚拟机》,不多说 |
|
返回顶楼 | |
发表时间:2011-01-15
freish 写道 yeshaoting 写道 weilingfeng98 写道 java的机制
谢谢你的回复... 嗯...我知道是java的机制. 我想知道这个机制的过程,具体是怎么做... 想多了解一点. 《深入java虚拟机》,不多说 嗯...谢谢. 我也是这么想的... 现在在学校没时间看,放假回家看看王森的这本书,好好补下虚拟机这方面的知识. 谢谢你的建议. |
|
返回顶楼 | |
发表时间:2011-01-15
属性,私有方法、静态方法、final方法都是静态绑定的,即编译期确定的。
其他方法是动态绑定的,即虚拟机运行时确定。 后者才可能出现override的情况。 |
|
返回顶楼 | |
发表时间:2011-01-16
最后修改:2011-01-16
silentlakeside 写道 属性,私有方法、静态方法、final方法都是静态绑定的,即编译期确定的。
其他方法是动态绑定的,即虚拟机运行时确定。 后者才可能出现override的情况。 是目前最好,最清楚的解释了. |
|
返回顶楼 | |