<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-42  評論-578  文章-1  trackbacks-0
    用這題目吸引大家注意,請見諒!
    以下代碼有些朋友可能會似曾熟識,可能也算不上“原創(chuàng)”,請見諒!
    不過,我出的這題,確定有點(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);
        }
    }

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



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

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

    評論:
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 09:10 | 凌晨風(fēng)
    我覺得應(yīng)該這樣理解:
    1. 由于先有父類后有子類,所以生成子類之前要首先有父類。但是有繼承,當(dāng)你試圖產(chǎn)生一個(gè)子類的實(shí)例時(shí),首先要執(zhí)行子類的構(gòu)造函數(shù),但是由于子類繼承父類,所以子類的構(gòu)造函數(shù)自動調(diào)用父類的構(gòu)造函數(shù)。先產(chǎn)生父類的實(shí)例,然后再產(chǎn)生子類的實(shí)例。
    2. 初始化問題,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() 就可以測試了,沒必要Father who = new Son(); 寫這個(gè),因?yàn)槟悴辉w現(xiàn)到繼承后的多態(tài),反而造成誤解,不過作為測試題目倒是挺擾人的。
    一家之言,不知對不對,希望大家給個(gè)正解
      回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 09:16 | bigruan
    對運(yùn)行結(jié)果不是很理解,博主能解釋下嗎?  回復(fù)  更多評論
      
    # 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ù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:32 | hbdrawn
    一樓的解釋關(guān)于null值得出現(xiàn)是不是不正確呢?  回復(fù)  更多評論
      
    # 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ù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:37 | fds
    都是son的內(nèi)容。java和c#不一樣。  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 11:16 | feenn
    這個(gè)題目其實(shí)是一個(gè)小Trick,要注意whoAmI和tellName函數(shù)的區(qū)別:一個(gè)是打印field的值,而另一個(gè)是打印參數(shù)。
    其實(shí)過程是這樣的:
    1.創(chuàng)建Son的時(shí)候先創(chuàng)建Father,而Father中的whoAmI是已經(jīng)被Son覆蓋了,因此這里打印的name這個(gè)field是Son中的field,而此時(shí)還沒有構(gòu)造Son,因此Son中的name的值是null(這里即使是寫了String name = "SON"也是沒有用的,因?yàn)楦割悰]有構(gòu)造結(jié)束之前,這里是不會被執(zhí)行的)。
    2.Father在執(zhí)行tellName的時(shí)候,傳遞的參數(shù)name是Father自身的name這個(gè)field值,這個(gè)值是已經(jīng)被賦值為"FATHER"的,因此會打印出“Son's name is FATHER”
    3.Father構(gòu)造完畢后開始構(gòu)造Son,這里的打印結(jié)果就可以按照常規(guī)方式來解釋了。  回復(fù)  更多評論
      
    # 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ù)  更多評論
      
    # 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>方法(這是必然的,既使沒有繼承任何類的類也會調(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í)候還沒有初始化,所以是 null ,這就是第一行輸出;然后是 tellName(name),當(dāng)然也是執(zhí)行的 Son 的 tellName(name) 方法,不同的是傳了參數(shù) name 進(jìn)來,這個(gè) name 是 Father 里的 name ,值是 "FATHER",于是就是第二行輸出。  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 13:47 | xzqttt
    @feenn
    正解  回復(fù)  更多評論
      
    # 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ù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 15:11 | nathen
    沒搞明白,因?yàn)榘凑沾蠹艺f的,
    . 初始化問題,java虛擬機(jī)初始化構(gòu)造函數(shù)可以,變量也可以,當(dāng)你new son()時(shí), whoAmI();首先調(diào)用Father初始化,但是String類型變量初始化有一個(gè)前提,第一次使用的時(shí)候才初始化,此時(shí) whoAmI();方法的name應(yīng)該為null,
    可為什么我上面的例子可以把值給打出來呢?  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 21:41 | bzp
    挺有趣,我同意 @feenn  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家[未登錄] 2009-11-29 10:40 | john
    關(guān)鍵:父類的引用指向之類對象的問題  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-30 09:16 | mathfox
    這個(gè)有意思,

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


    @feenn
    正解
      回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-02 13:52 | jl6250
    @nathen
    你的Class Son()是沒有繼承Father(),所以根據(jù)JAVA Class的初始化順序,應(yīng)該先初始化成員變量,然后再執(zhí)行構(gòu)造函數(shù),所以打印出來的結(jié)果會是
    Hell everyone i'mtest
    Hell world!!!my name is test 。
      回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家[未登錄] 2009-12-05 12:46 | rabbit
    用eclipse調(diào)試一下,就可以發(fā)現(xiàn),方法都是調(diào)用Son的方法,所有會出現(xiàn)第一次為null
    第二次方法調(diào)用很值得我們深思啊,他告訴了我們調(diào)用父類隱藏字段的方法  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-06 22:54 | 凌晨風(fēng)
    我也是一家之言,執(zhí)行父類的構(gòu)造函數(shù)時(shí)因?yàn)樽宇愔貙懥舜朔椒ǎ藭r(shí)Son的name還沒有構(gòu)造出來。  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-08 23:22 | ynyee
    這種寫法只是一種語法,并不能用我們看到的語法加上老師告訴我們的理論來確定這件事情,我倒覺得是這是一種編寫代碼的語法,真正在執(zhí)行的時(shí)候,可能我們所做的String name="Father" 這種操作,不是一下就完成的,大致上應(yīng)該是先將指針指向NULL,再創(chuàng)建Father字符串,再把指針指向這個(gè)字符串,在賦值這個(gè)階段,使用的是子類的實(shí)例所以調(diào)用的是自身的方法,輸出的name是NULL,這時(shí)候輸出的按理來說是子類的name屬性。同樣還沒來得及賦值。所謂的初始化,可能只是一個(gè)不成名的法則。統(tǒng)一一個(gè)地方來賦值,準(zhǔn)備開工。  回復(fù)  更多評論
      
    # 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ù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2011-03-28 00:13 | Duke
    說下俺的理解,菜鳥一個(gè)大家別噴
    首先由于SON繼承了FATHER,所以也同樣繼承了父類的所有方法,但是因?yàn)榉椒ㄍ宰宇惙椒ǜ采w了父類的方法。但是由于是通過SON類來實(shí)例,所以肯定要先實(shí)例化父類,直接進(jìn)去父類的無參數(shù)構(gòu)造方法,此時(shí)name并沒有值是null,所以whoAmI()方法產(chǎn)生了Son says, I am null,接著執(zhí)行tellName(name),此時(shí)FATHER會去尋找name的值,此刻name被賦值為FATHER,產(chǎn)生了Son's name is FATHER;執(zhí)行晚會來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é)果是什么樣子的嘛?答案由你來揭曉。  回復(fù)  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2013-04-16 16:54 | 王智鐘
    @hbdrawn
    父類的private String name="FATHER";的變量時(shí)不繼承給子類的,是private類型。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 国产免费直播在线观看视频| 男女猛烈xx00免费视频试看| 亚洲中文字幕无码一久久区| 成人免费无码大片a毛片| 免费人成在线观看网站| 人人爽人人爽人人片A免费| 亚洲伦理中文字幕| 亚洲欧洲国产经精品香蕉网| 亚洲成AV人片一区二区| 亚洲国产综合人成综合网站| 扒开双腿猛进入爽爽免费视频 | 久久午夜免费视频| 无码日韩精品一区二区免费暖暖| 一区二区视频在线免费观看| 老司机午夜性生免费福利 | 成人免费一区二区无码视频| 99re在线视频免费观看| 久久免费国产精品一区二区| 黄色视屏在线免费播放| 国产成人精品免费大全| 国产成人1024精品免费| 亚洲黄片手机免费观看| 一区二区免费国产在线观看 | 无遮免费网站在线入口| 久久国产色AV免费观看| 久久精品电影免费动漫| 免费国产成人α片| 67pao强力打造高清免费| 久久99国产综合精品免费| 一级毛片在线免费观看| 日韩精品极品视频在线观看免费| 男人都懂www深夜免费网站| 免费无码成人AV在线播放不卡| 免费观看男人吊女人视频| 99视频免费播放| 国产免费女女脚奴视频网| 好男人www免费高清视频在线| 永久免费bbbbbb视频| 五月婷婷亚洲综合| 在线日韩日本国产亚洲| 亚洲s色大片在线观看|