<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)”,請見諒!
    不過,我出的這題,確定有點意思,考考大家。
    /**
     * 父類
     * 
    @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);
        }
    }

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



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

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

    評論:
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 09:10 | 凌晨風
    我覺得應該這樣理解:
    1. 由于先有父類后有子類,所以生成子類之前要首先有父類。但是有繼承,當你試圖產(chǎn)生一個子類的實例時,首先要執(zhí)行子類的構造函數(shù),但是由于子類繼承父類,所以子類的構造函數(shù)自動調用父類的構造函數(shù)。先產(chǎn)生父類的實例,然后再產(chǎn)生子類的實例。
    2. 初始化問題,java虛擬機初始化構造函數(shù)可以,變量也可以,當你new son()時, whoAmI();首先調用Father初始化,但是String類型變量初始化有一個前提,第一次使用的時候才初始化,此時 whoAmI();方法的name應該為null,其后可以正常解釋了。
    3. new Son() 就可以測試了,沒必要Father who = new Son(); 寫這個,因為你不曾體現(xiàn)到繼承后的多態(tài),反而造成誤解,不過作為測試題目倒是挺擾人的。
    一家之言,不知對不對,希望大家給個正解
      回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 09:16 | bigruan
    對運行結果不是很理解,博主能解釋下嗎?  回復  更多評論
      
    # 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  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:32 | hbdrawn
    一樓的解釋關于null值得出現(xiàn)是不是不正確呢?  回復  更多評論
      
    # 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  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 10:37 | fds
    都是son的內(nèi)容。java和c#不一樣。  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-11-28 11:16 | feenn
    這個題目其實是一個小Trick,要注意whoAmI和tellName函數(shù)的區(qū)別:一個是打印field的值,而另一個是打印參數(shù)。
    其實過程是這樣的:
    1.創(chuàng)建Son的時候先創(chuàng)建Father,而Father中的whoAmI是已經(jīng)被Son覆蓋了,因此這里打印的name這個field是Son中的field,而此時還沒有構造Son,因此Son中的name的值是null(這里即使是寫了String name = "SON"也是沒有用的,因為父類沒有構造結束之前,這里是不會被執(zhí)行的)。
    2.Father在執(zhí)行tellName的時候,傳遞的參數(shù)name是Father自身的name這個field值,這個值是已經(jīng)被賦值為"FATHER"的,因此會打印出“Son's name is FATHER”
    3.Father構造完畢后開始構造Son,這里的打印結果就可以按照常規(guī)方式來解釋了。  回復  更多評論
      
    # 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
    運行了下,但還是不太明白  回復  更多評論
      
    # 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

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

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

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


    @feenn
    正解
      回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-02 13:52 | jl6250
    @nathen
    你的Class Son()是沒有繼承Father(),所以根據(jù)JAVA Class的初始化順序,應該先初始化成員變量,然后再執(zhí)行構造函數(shù),所以打印出來的結果會是
    Hell everyone i'mtest
    Hell world!!!my name is test 。
      回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家[未登錄] 2009-12-05 12:46 | rabbit
    用eclipse調試一下,就可以發(fā)現(xiàn),方法都是調用Son的方法,所有會出現(xiàn)第一次為null
    第二次方法調用很值得我們深思啊,他告訴了我們調用父類隱藏字段的方法  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-06 22:54 | 凌晨風
    我也是一家之言,執(zhí)行父類的構造函數(shù)時因為子類重寫了此方法,而此時Son的name還沒有構造出來。  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-08 23:22 | ynyee
    這種寫法只是一種語法,并不能用我們看到的語法加上老師告訴我們的理論來確定這件事情,我倒覺得是這是一種編寫代碼的語法,真正在執(zhí)行的時候,可能我們所做的String name="Father" 這種操作,不是一下就完成的,大致上應該是先將指針指向NULL,再創(chuàng)建Father字符串,再把指針指向這個字符串,在賦值這個階段,使用的是子類的實例所以調用的是自身的方法,輸出的name是NULL,這時候輸出的按理來說是子類的name屬性。同樣還沒來得及賦值。所謂的初始化,可能只是一個不成名的法則。統(tǒ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  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2011-03-28 00:13 | Duke
    說下俺的理解,菜鳥一個大家別噴
    首先由于SON繼承了FATHER,所以也同樣繼承了父類的所有方法,但是因為方法同名,所以子類方法覆蓋了父類的方法。但是由于是通過SON類來實例,所以肯定要先實例化父類,直接進去父類的無參數(shù)構造方法,此時name并沒有值是null,所以whoAmI()方法產(chǎn)生了Son says, I am null,接著執(zhí)行tellName(name),此時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;
    運行正確答案:
    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";
    在非機器運行你能猜出結果是什么樣子的嘛?答案由你來揭曉。  回復  更多評論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2013-04-16 16:54 | 王智鐘
    @hbdrawn
    父類的private String name="FATHER";的變量時不繼承給子類的,是private類型。  回復  更多評論
      
    主站蜘蛛池模板: 亚洲午夜精品一区二区公牛电影院| 亚洲av乱码中文一区二区三区| 国产在线a免费观看| 亚洲欧洲AV无码专区| 亚洲综合色视频在线观看| 特级无码毛片免费视频尤物| 亚洲日韩久久综合中文字幕| 亚洲精品乱码久久久久久不卡| 在线免费观看国产| 日韩色视频一区二区三区亚洲| 亚洲VA中文字幕无码毛片| 毛片a级毛片免费观看免下载| 三级黄色在线免费观看| 亚洲中文字幕一二三四区苍井空 | 亚洲国产成人九九综合| 免费中文字幕在线| 久草视频在线免费看| 精品久久久久久亚洲综合网| 亚洲人成电影在线天堂| 国产一级淫片免费播放电影| 91香蕉国产线在线观看免费| 日韩大片在线永久免费观看网站| 亚洲jjzzjjzz在线观看| 中文字幕精品无码亚洲字| 最近中文字幕免费mv视频8| 99久久免费国产特黄| 亚洲国产成人久久精品大牛影视| 亚洲电影一区二区| 亚洲乱码中文字幕手机在线| 成人免费的性色视频| 中文字幕无码免费久久9一区9 | 99久久综合精品免费| 一级毛片在播放免费| 亚洲色www永久网站| 亚洲午夜在线电影| 亚洲一区精品无码| 日韩免费一区二区三区| 麻豆最新国产剧情AV原创免费| a毛片免费全部播放完整成| 黄色一级视频免费观看| 亚洲乱码日产精品一二三|