锁定老帖子 主题:上转型对象 - 平时没有注意的地方
精华帖 (0) :: 良好帖 (5) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-18
曾经听过这么一句话
通过引用取属性,不看对象看引用 通过引用调方法,不看引用看对象 可见多态性是表现在 方法上的 |
|
返回顶楼 | |
发表时间:2011-01-18
skyuck 写道 java编程思想 多态那一章节有讲
另外我的博客第一篇也是谈这个的 晚上会寝室会看会java编程思想,我比较笨,看得慢. 过年回家好好学下...真的很欠缺. 一会去你博客学习学习. |
|
返回顶楼 | |
发表时间:2011-01-18
ray_linn 写道 本来儿子就可以重写父亲的field,根本不用再取一个同名的field...
名字是相同,但是其值(内容)不一样嘛. 就像方法重写,名字不也相同嘛~ 本人愚钝,感觉没回答到点子上. |
|
返回顶楼 | |
发表时间:2011-01-18
yeshaoting 写道 ray_linn 写道 本来儿子就可以重写父亲的field,根本不用再取一个同名的field...
名字是相同,但是其值(内容)不一样嘛. 就像方法重写,名字不也相同嘛~ 本人愚钝,感觉没回答到点子上. 在实际开发中一般不会出现这种情况,因为一般情况下所有的field的访问域都设置成private的,因此不能直接访问他们,而是通过调用方法去访问 |
|
返回顶楼 | |
发表时间:2011-01-18
haigui.chen 写道 重写(override):父类中的实例方法被其子类重新实现。既然是实例方法,那就是非 static 修饰的了,否则就是 static 静态方法了,那叫做类方法。在我看来,正是重写这一机制的存在,才为多态机制提供了基础。或许 implements (实现)一个 interface (接口)中所声明的方法也能成为重写,因为 interface 的一部分存在原因也是为了多态。
隐藏(hide):子类的某个字段、静态方法、成员内部类与其父类的具有相同名字(对于静态方法还需要相同的参数列表),此时父类对应的字段、静态方法、成员内部类就被隐藏了。 嗯.学习了~ 重写说得蛮好,隐藏貌似有点空洞. |
|
返回顶楼 | |
发表时间: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 啰嗦这么多,希望能稍微解释清楚点... |
|
返回顶楼 | |
发表时间: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 啰嗦这么多,希望能稍微解释清楚点... 嗯.不啰嗦,说得挺好的. 虽然好多我还听不太懂. 倒是给我引入了一些新的知识,一些虚拟机方面底层的知识. 现在欠缺的知识还是蛮多的,过年回家好好学习. 以后的学习中会注意了解的. 再次感谢~ |
|
返回顶楼 | |
发表时间:2011-01-18
shijie_262 写道 曾经听过这么一句话
通过引用取属性,不看对象看引用 通过引用调方法,不看引用看对象 可见多态性是表现在 方法上的 嗯...你说的是对的. 但为啥多态性只表现在方法上? 难道多态性表现在属性上没有意义? |
|
返回顶楼 | |
发表时间:2011-01-18
yeshaoting 写道 shijie_262 写道 曾经听过这么一句话
通过引用取属性,不看对象看引用 通过引用调方法,不看引用看对象 可见多态性是表现在 方法上的 嗯...你说的是对的. 但为啥多态性只表现在方法上? 难道多态性表现在属性上没有意义? 比如说人这个类有名字这个属性 这是个公用的属性,根本没有必要去覆盖整个属性 子类已经有了父类的field了,子类如果需要要直接可以操作父类的field,而没有必要通过覆盖父类的属性方式。 所以说多态性表现在属性上没有意义 况且属性表现在类上多使用private的。 |
|
返回顶楼 | |
发表时间:2011-01-19
skyuck 写道 yeshaoting 写道 ray_linn 写道 本来儿子就可以重写父亲的field,根本不用再取一个同名的field...
名字是相同,但是其值(内容)不一样嘛. 就像方法重写,名字不也相同嘛~ 本人愚钝,感觉没回答到点子上. 在实际开发中一般不会出现这种情况,因为一般情况下所有的field的访问域都设置成private的,因此不能直接访问他们,而是通过调用方法去访问 嗯...也对.实际开发中确实是用的javabean,然后将field权限设置成private,再有对应的set,get方法访问field. |
|
返回顶楼 | |