隨筆-42  評(píng)論-578  文章-1  trackbacks-0
          用這題目吸引大家注意,請(qǐng)見(jiàn)諒!
          以下代碼有些朋友可能會(huì)似曾熟識(shí),可能也算不上“原創(chuàng)”,請(qǐng)見(jiàn)諒!
          不過(guò),我出的這題,確定有點(diǎn)意思,考考大家。
          /**
           * 父類
           * 
          @author rongxinhua
           *
           
          */
          public class Father{
              
          private String name="FATHER";
              
          public Father(){
                  whoAmI();
                  tellName(name);
              }
              
          public void whoAmI(){
                  System.out.println(
          "Father says, I am " + name);
              }
              
          public void tellName(String name){
                  System.out.println(
          "Father's name is " + name);
              }
          }

          /**
           * 子類
           * 
          @author rongxinhua
           *
           
          */
          public class Son extends Father{
              
          private String name="SON";
              
          public Son(){
                  whoAmI();
                  tellName(name);
              }
              
          public void whoAmI(){
                  System.out.println(
          "Son says, I am " + name);
              }
              
          public void tellName(String name){
                  System.out.println(
          "Son's name is " + name);
              }
          }

          問(wèn)題:當(dāng)執(zhí)行 Father who = new Son(); 時(shí),會(huì)輸出什么?
          如果你去參加一個(gè)公司的筆試或面試時(shí)問(wèn)了這么一道題,在沒(méi)有環(huán)境測(cè)試的情況下,你會(huì)猜測(cè)什么答案?



          本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處,謝謝!http://www.aygfsteel.com/rongxh7(心夢(mèng)帆影JavaEE技術(shù)博客)
              

          posted on 2009-11-28 03:21 心夢(mèng)帆影 閱讀(4052) 評(píng)論(24)  編輯  收藏 所屬分類: JavaSE

          評(píng)論:
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 09:10 | 凌晨風(fēng)
          我覺(jué)得應(yīng)該這樣理解:
          1. 由于先有父類后有子類,所以生成子類之前要首先有父類。但是有繼承,當(dāng)你試圖產(chǎn)生一個(gè)子類的實(shí)例時(shí),首先要執(zhí)行子類的構(gòu)造函數(shù),但是由于子類繼承父類,所以子類的構(gòu)造函數(shù)自動(dòng)調(diào)用父類的構(gòu)造函數(shù)。先產(chǎn)生父類的實(shí)例,然后再產(chǎn)生子類的實(shí)例。
          2. 初始化問(wèn)題,java虛擬機(jī)初始化構(gòu)造函數(shù)可以,變量也可以,當(dāng)你new son()時(shí), whoAmI();首先調(diào)用Father初始化,但是String類型變量初始化有一個(gè)前提,第一次使用的時(shí)候才初始化,此時(shí) whoAmI();方法的name應(yīng)該為null,其后可以正常解釋了。
          3. new Son() 就可以測(cè)試了,沒(méi)必要Father who = new Son(); 寫(xiě)這個(gè),因?yàn)槟悴辉w現(xiàn)到繼承后的多態(tài),反而造成誤解,不過(guò)作為測(cè)試題目倒是挺擾人的。
          一家之言,不知對(duì)不對(duì),希望大家給個(gè)正解
            回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 09:16 | bigruan
          對(duì)運(yùn)行結(jié)果不是很理解,博主能解釋下嗎?  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:05 | hantuo
          我的答案:

          Father says, I am FATHER
          Father's name is FATHER
          Son says, I am SON
          Son's name is SON  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:32 | hbdrawn
          一樓的解釋關(guān)于null值得出現(xiàn)是不是不正確呢?  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:33 | hbdrawn
          正解:
          Son says, I am null
          Son's name is FATHER
          Son says, I am SON
          Son's name is SON  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:37 | fds
          都是son的內(nèi)容。java和c#不一樣。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 11:16 | feenn
          這個(gè)題目其實(shí)是一個(gè)小Trick,要注意whoAmI和tellName函數(shù)的區(qū)別:一個(gè)是打印field的值,而另一個(gè)是打印參數(shù)。
          其實(shí)過(guò)程是這樣的:
          1.創(chuàng)建Son的時(shí)候先創(chuàng)建Father,而Father中的whoAmI是已經(jīng)被Son覆蓋了,因此這里打印的name這個(gè)field是Son中的field,而此時(shí)還沒(méi)有構(gòu)造Son,因此Son中的name的值是null(這里即使是寫(xiě)了String name = "SON"也是沒(méi)有用的,因?yàn)楦割悰](méi)有構(gòu)造結(jié)束之前,這里是不會(huì)被執(zhí)行的)。
          2.Father在執(zhí)行tellName的時(shí)候,傳遞的參數(shù)name是Father自身的name這個(gè)field值,這個(gè)值是已經(jīng)被賦值為"FATHER"的,因此會(huì)打印出“Son's name is FATHER”
          3.Father構(gòu)造完畢后開(kāi)始構(gòu)造Son,這里的打印結(jié)果就可以按照常規(guī)方式來(lái)解釋了。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 11:35 | Never
          Son's name:null
          Som says: my name is:null
          Son's name:Son
          Som says: my name is:Son
          運(yùn)行了下,但還是不太明白  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 12:08 | Leonfisher
          Son says, I am null
          Son's name is FATHER
          Son says, I am SON
          Son's name is SON

          后面兩項(xiàng)輸出應(yīng)該都能理解,主要是前面兩項(xiàng),分享一下我的理解:
          new Son() 時(shí),首先初始調(diào)用父類的<init>方法(這是必然的,既使沒(méi)有繼承任何類的類也會(huì)調(diào)用 Object 的<init>方法),這樣就執(zhí)行到 Father 類的 <init> 方法,首先是成員變量的初始化,private String name="FATHER",然后執(zhí)行 whoAmI(),因?yàn)?Son overwrite 了這個(gè)方法,所以實(shí)際執(zhí)行 Son 的 whoAmI() 方法,Son 的 whoAmI() 方法中使用了 name 變量,這里用的實(shí)際是 Son 的 name 變量,這個(gè)時(shí)候還沒(méi)有初始化,所以是 null ,這就是第一行輸出;然后是 tellName(name),當(dāng)然也是執(zhí)行的 Son 的 tellName(name) 方法,不同的是傳了參數(shù) name 進(jìn)來(lái),這個(gè) name 是 Father 里的 name ,值是 "FATHER",于是就是第二行輸出。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 13:47 | xzqttt
          @feenn
          正解  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 15:08 | nathen
          public class Son {

          private String userName = "test";

          Son() {
          whoAmI();
          sayMyName(this.userName);

          }

          public void whoAmI() {
          System.out.println("Hell everyone i'm" + userName);
          }

          public void sayMyName(String username) {
          System.out.println("Hell world!!!my name is " + userName);
          }

          public static void main(String args[]) {
          Son son = new Son();
          }
          }

          幫忙解釋下,為什么上面的代碼的結(jié)果是
          Hell everyone i'mtest
          Hell world!!!my name is test
          而不是
          Hell everyone i'm null  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 15:11 | nathen
          沒(méi)搞明白,因?yàn)榘凑沾蠹艺f(shuō)的,
          . 初始化問(wèn)題,java虛擬機(jī)初始化構(gòu)造函數(shù)可以,變量也可以,當(dāng)你new son()時(shí), whoAmI();首先調(diào)用Father初始化,但是String類型變量初始化有一個(gè)前提,第一次使用的時(shí)候才初始化,此時(shí) whoAmI();方法的name應(yīng)該為null,
          可為什么我上面的例子可以把值給打出來(lái)呢?  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 21:41 | bzp
          挺有趣,我同意 @feenn  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家[未登錄](méi) 2009-11-29 10:40 | john
          關(guān)鍵:父類的引用指向之類對(duì)象的問(wèn)題  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-30 09:16 | mathfox
          這個(gè)有意思,

          我都回答錯(cuò)了,唉,還要努力。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-30 10:22 | 凌晨風(fēng)
          @Leonfisher
          正解  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-01 12:39 | Gua_Hu
          @凌晨風(fēng)
          但是String類型變量初始化有一個(gè)前提,第一次使用的時(shí)候才初始化.
          -----
          不是這樣吧?


          @feenn
          正解
            回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-02 13:52 | jl6250
          @nathen
          你的Class Son()是沒(méi)有繼承Father(),所以根據(jù)JAVA Class的初始化順序,應(yīng)該先初始化成員變量,然后再執(zhí)行構(gòu)造函數(shù),所以打印出來(lái)的結(jié)果會(huì)是
          Hell everyone i'mtest
          Hell world!!!my name is test 。
            回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家[未登錄](méi) 2009-12-05 12:46 | rabbit
          用eclipse調(diào)試一下,就可以發(fā)現(xiàn),方法都是調(diào)用Son的方法,所有會(huì)出現(xiàn)第一次為null
          第二次方法調(diào)用很值得我們深思啊,他告訴了我們調(diào)用父類隱藏字段的方法  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-06 22:54 | 凌晨風(fēng)
          我也是一家之言,執(zhí)行父類的構(gòu)造函數(shù)時(shí)因?yàn)樽宇愔貙?xiě)了此方法,而此時(shí)Son的name還沒(méi)有構(gòu)造出來(lái)。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-08 23:22 | ynyee
          這種寫(xiě)法只是一種語(yǔ)法,并不能用我們看到的語(yǔ)法加上老師告訴我們的理論來(lái)確定這件事情,我倒覺(jué)得是這是一種編寫(xiě)代碼的語(yǔ)法,真正在執(zhí)行的時(shí)候,可能我們所做的String name="Father" 這種操作,不是一下就完成的,大致上應(yīng)該是先將指針指向NULL,再創(chuàng)建Father字符串,再把指針指向這個(gè)字符串,在賦值這個(gè)階段,使用的是子類的實(shí)例所以調(diào)用的是自身的方法,輸出的name是NULL,這時(shí)候輸出的按理來(lái)說(shuō)是子類的name屬性。同樣還沒(méi)來(lái)得及賦值。所謂的初始化,可能只是一個(gè)不成名的法則。統(tǒng)一一個(gè)地方來(lái)賦值,準(zhǔn)備開(kāi)工。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2010-04-23 22:09 | ren
          正確答案
          Son says, I am null
          Son's name is FATHER
          Son says, I am SON
          Son's name is SON  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2011-03-28 00:13 | Duke
          說(shuō)下俺的理解,菜鳥(niǎo)一個(gè)大家別噴
          首先由于SON繼承了FATHER,所以也同樣繼承了父類的所有方法,但是因?yàn)榉椒ㄍ?,所以子類方法覆蓋了父類的方法。但是由于是通過(guò)SON類來(lái)實(shí)例,所以肯定要先實(shí)例化父類,直接進(jìn)去父類的無(wú)參數(shù)構(gòu)造方法,此時(shí)name并沒(méi)有值是null,所以whoAmI()方法產(chǎn)生了Son says, I am null,接著執(zhí)行tellName(name),此時(shí)FATHER會(huì)去尋找name的值,此刻name被賦值為FATHER,產(chǎn)生了Son's name is FATHER;執(zhí)行晚會(huì)來(lái)SON類里面按照由上到下的順序產(chǎn)生了后面2句Son says, I am SON;Son's name is SON;
          運(yùn)行正確答案:
          Son says, I am null
          Son's name is FATHER
          Son says, I am SON
          Son's name is SON

          如果父類FATHER中聲明變量private static String name="FATHER";
          在非機(jī)器運(yùn)行你能猜出結(jié)果是什么樣子的嘛?答案由你來(lái)揭曉。  回復(fù)  更多評(píng)論
            
          # re: 原創(chuàng)一道Java筆試面試題考考大家 2013-04-16 16:54 | 王智鐘
          @hbdrawn
          父類的private String name="FATHER";的變量時(shí)不繼承給子類的,是private類型。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 灵山县| 漳平市| 靖州| 壤塘县| 祥云县| 景德镇市| 连山| 栾川县| 察雅县| 紫云| 惠来县| 杂多县| 绥滨县| 大田县| 墨竹工卡县| 视频| 阿瓦提县| 赣榆县| 东乌| 峨边| 石棉县| 诏安县| 松原市| 石泉县| 古田县| 中阳县| 华蓥市| 界首市| 榆中县| 吉安市| 子洲县| 武陟县| 文水县| 茌平县| 镇原县| 红桥区| 徐汇区| 泗洪县| 舒城县| 苍梧县| 天峨县|