论坛首页 Java企业应用论坛

上转型对象 - 平时没有注意的地方

浏览 22690 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-18  
曾经听过这么一句话
通过引用取属性,不看对象看引用
通过引用调方法,不看引用看对象
可见多态性是表现在 方法上的
0 请登录后投票
   发表时间:2011-01-18  
skyuck 写道
java编程思想  多态那一章节有讲

另外我的博客第一篇也是谈这个的

晚上会寝室会看会java编程思想,我比较笨,看得慢.
过年回家好好学下...真的很欠缺.

一会去你博客学习学习.
0 请登录后投票
   发表时间:2011-01-18  
ray_linn 写道
本来儿子就可以重写父亲的field,根本不用再取一个同名的field...

名字是相同,但是其值(内容)不一样嘛.
就像方法重写,名字不也相同嘛~
本人愚钝,感觉没回答到点子上.
0 请登录后投票
   发表时间:2011-01-18  
yeshaoting 写道
ray_linn 写道
本来儿子就可以重写父亲的field,根本不用再取一个同名的field...

名字是相同,但是其值(内容)不一样嘛.
就像方法重写,名字不也相同嘛~
本人愚钝,感觉没回答到点子上.



在实际开发中一般不会出现这种情况,因为一般情况下所有的field的访问域都设置成private的,因此不能直接访问他们,而是通过调用方法去访问
0 请登录后投票
   发表时间:2011-01-18  
haigui.chen 写道
重写(override):父类中的实例方法被其子类重新实现。既然是实例方法,那就是非 static 修饰的了,否则就是 static 静态方法了,那叫做类方法。在我看来,正是重写这一机制的存在,才为多态机制提供了基础。或许 implements (实现)一个 interface (接口)中所声明的方法也能成为重写,因为 interface 的一部分存在原因也是为了多态。


隐藏(hide):子类的某个字段、静态方法、成员内部类与其父类的具有相同名字(对于静态方法还需要相同的参数列表),此时父类对应的字段、静态方法、成员内部类就被隐藏了


嗯.学习了~
重写说得蛮好,隐藏貌似有点空洞.
0 请登录后投票
   发表时间:2011-01-18  
yeshaoting 写道
haigui.chen 写道
重写(override):父类中的实例方法被其子类重新实现。既然是实例方法,那就是非 static 修饰的了,否则就是 static 静态方法了,那叫做类方法。在我看来,正是重写这一机制的存在,才为多态机制提供了基础。或许 implements (实现)一个 interface (接口)中所声明的方法也能成为重写,因为 interface 的一部分存在原因也是为了多态。


隐藏(hide):子类的某个字段、静态方法、成员内部类与其父类的具有相同名字(对于静态方法还需要相同的参数列表),此时父类对应的字段、静态方法、成员内部类就被隐藏了


嗯.学习了~
重写说得蛮好,隐藏貌似有点空洞.



其实,这些概念,如果能看看bytecode是非常清楚的。
对于override基本上用invokevirtual 指令,这个名字就很形象...
而对于static的方法,用的是invokestatic,而且static方法最好通过class 名字调用,就很清楚了,对象引用时什么类型,就是调用的该类型的方法...
btw,对于interface,用的invokeinterface。

对于LZ提到的访问变量,用的getfield,对于field,记住,它不能被重写.

Fields cannot be overriden


啰嗦这么多,希望能稍微解释清楚点...
0 请登录后投票
   发表时间:2011-01-18  
haigui.chen 写道
yeshaoting 写道
haigui.chen 写道
重写(override):父类中的实例方法被其子类重新实现。既然是实例方法,那就是非 static 修饰的了,否则就是 static 静态方法了,那叫做类方法。在我看来,正是重写这一机制的存在,才为多态机制提供了基础。或许 implements (实现)一个 interface (接口)中所声明的方法也能成为重写,因为 interface 的一部分存在原因也是为了多态。


隐藏(hide):子类的某个字段、静态方法、成员内部类与其父类的具有相同名字(对于静态方法还需要相同的参数列表),此时父类对应的字段、静态方法、成员内部类就被隐藏了


嗯.学习了~
重写说得蛮好,隐藏貌似有点空洞.



其实,这些概念,如果能看看bytecode是非常清楚的。
对于override基本上用invokevirtual 指令,这个名字就很形象...
而对于static的方法,用的是invokestatic,而且static方法最好通过class 名字调用,就很清楚了,对象引用时什么类型,就是调用的该类型的方法...
btw,对于interface,用的invokeinterface。

对于LZ提到的访问变量,用的getfield,对于field,记住,它不能被重写.

Fields cannot be overriden


啰嗦这么多,希望能稍微解释清楚点...

嗯.不啰嗦,说得挺好的.
虽然好多我还听不太懂.
倒是给我引入了一些新的知识,一些虚拟机方面底层的知识.
现在欠缺的知识还是蛮多的,过年回家好好学习.
以后的学习中会注意了解的.
再次感谢~
0 请登录后投票
   发表时间:2011-01-18  
shijie_262 写道
曾经听过这么一句话
通过引用取属性,不看对象看引用
通过引用调方法,不看引用看对象
可见多态性是表现在 方法上的

嗯...你说的是对的.

但为啥多态性只表现在方法上?
难道多态性表现在属性上没有意义?
0 请登录后投票
   发表时间:2011-01-18  
yeshaoting 写道
shijie_262 写道
曾经听过这么一句话
通过引用取属性,不看对象看引用
通过引用调方法,不看引用看对象
可见多态性是表现在 方法上的

嗯...你说的是对的.

但为啥多态性只表现在方法上?
难道多态性表现在属性上没有意义?



比如说人这个类有名字这个属性
这是个公用的属性,根本没有必要去覆盖整个属性

子类已经有了父类的field了,子类如果需要要直接可以操作父类的field,而没有必要通过覆盖父类的属性方式。

所以说多态性表现在属性上没有意义

况且属性表现在类上多使用private的。

0 请登录后投票
   发表时间:2011-01-19  
skyuck 写道
yeshaoting 写道
ray_linn 写道
本来儿子就可以重写父亲的field,根本不用再取一个同名的field...

名字是相同,但是其值(内容)不一样嘛.
就像方法重写,名字不也相同嘛~
本人愚钝,感觉没回答到点子上.



在实际开发中一般不会出现这种情况,因为一般情况下所有的field的访问域都设置成private的,因此不能直接访问他们,而是通过调用方法去访问

嗯...也对.实际开发中确实是用的javabean,然后将field权限设置成private,再有对应的set,get方法访问field.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics