作者conanist (QQ)
看板java
标题Re: [J2SE] 多型与转型
时间Wed Jul 15 09:55:05 2009
※ 引述《kun25086 (我是宅宅)》之铭言:
: ※ 引述《forris (乔巴)》之铭言:
: : class Father{
: : String name = "Father";
: : String getName(){
: : return name;
: : }
: : String greeting(){
: : return "class Father";
: : }
: : }
: : class Son extends Father{
: : String name = "Son";
: : String greeting(){
: : return "class Son";
: : }
: public static void main ( String[] args ) {
: Father father = new Son();
: System.out.print( father.greeting() );
: System.out.print( father.name );
: System.out.print( father.getName() );
: }
: : }
: 想请问在main里的程式,
: 输出的结果是 class Son , Father , Father
: 爬文後小弟对於输出的结果有些不了解,想请问各位小弟的观念哪里有问题?
: Father father = new Son() ; <== 一个叫作father的东西,长得像Father,
: 但实体是Son。
: 所以第一个print ( father.greeting() ) ; 会去找Son里面的greeting(),
: (因为实体是son嘛),也因此印出来的东西是 class Son。
: 第三个print ( father.getName() ); 会去Son里找getName(),但由於Son里没有,
: 所以会去父类别里找getName(),因此印出来是Father。
: 不过第二个,为什麽不是在Son里面找name,而是去Father里面找name呢?
: 是因为属性和方法是不一样的做法吗? 还是小弟我的观念有问题?
: 烦请各位高手帮我解答一下,感恩!
整个流程就是以Father 为主,当你呼叫Father 的成员函数的时候
会先在Father 找有没有这个函数,找到之後会去找Son的类别里面看看有没有overriding
如果有会取代,没有就用Father自己的函式
但是对於属性来说,不是这样处理,你呼叫谁就是谁
当Father 跟Son 都有name,这个name 在Son里面是重新宣告的跟Father一点关系都没有
所以当你呼叫Father.name 跟 Son.name 是呼叫各自的name
如果你改成 一个private 跟public 你会比较清楚
重点是 你为什麽要写 Father father = new Son();
甚麽情况下你会用到这个写法? 除了考试的情况外
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.70.121.30
1F:→ neigence:反对你最後2句,要多型本来就是要这样子用 07/15 10:47
2F:→ neigence:我是指... 那样的写法 很常见吧 07/15 10:52
3F:推 PsMonkey:单纯看最後两句... 天天用耶.... XDXD 07/15 11:21
4F:→ godfat:想必是名字的问题... XD father = new son ??? 07/15 11:41
5F:推 kun25086:所以是我的观念也有问题罗,主要还是以Father为主,只是 07/15 13:55
6F:→ kun25086:方法还会去Son里找有没有overriding,而属性不会罗? 07/15 13:57
7F:→ adrianshum:可以这样说 07/15 14:30
8F:→ kun25086:感谢所有高手的解答!感恩! 07/17 16:52