<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
    用這題目吸引大家注意,請見諒!
    以下代碼有些朋友可能會似曾熟識,可能也算不上“原創”,請見諒!
    不過,我出的這題,確定有點意思,考考大家。
    /**
     * 父類
     * 
    @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);
        }
    }

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



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

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

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

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


    @feenn
    正解
      回復  更多評論
      
    # re: 原創一道Java筆試面試題考考大家 2009-12-02 13:52 | jl6250
    @nathen
    你的Class Son()是沒有繼承Father(),所以根據JAVA Class的初始化順序,應該先初始化成員變量,然后再執行構造函數,所以打印出來的結果會是
    Hell everyone i'mtest
    Hell world!!!my name is test 。
      回復  更多評論
      
    # re: 原創一道Java筆試面試題考考大家[未登錄] 2009-12-05 12:46 | rabbit
    用eclipse調試一下,就可以發現,方法都是調用Son的方法,所有會出現第一次為null
    第二次方法調用很值得我們深思啊,他告訴了我們調用父類隱藏字段的方法  回復  更多評論
      
    # re: 原創一道Java筆試面試題考考大家 2009-12-06 22:54 | 凌晨風
    我也是一家之言,執行父類的構造函數時因為子類重寫了此方法,而此時Son的name還沒有構造出來。  回復  更多評論
      
    # re: 原創一道Java筆試面試題考考大家 2009-12-08 23:22 | ynyee
    這種寫法只是一種語法,并不能用我們看到的語法加上老師告訴我們的理論來確定這件事情,我倒覺得是這是一種編寫代碼的語法,真正在執行的時候,可能我們所做的String name="Father" 這種操作,不是一下就完成的,大致上應該是先將指針指向NULL,再創建Father字符串,再把指針指向這個字符串,在賦值這個階段,使用的是子類的實例所以調用的是自身的方法,輸出的name是NULL,這時候輸出的按理來說是子類的name屬性。同樣還沒來得及賦值。所謂的初始化,可能只是一個不成名的法則。統一一個地方來賦值,準備開工。  回復  更多評論
      
    # re: 原創一道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: 原創一道Java筆試面試題考考大家 2011-03-28 00:13 | Duke
    說下俺的理解,菜鳥一個大家別噴
    首先由于SON繼承了FATHER,所以也同樣繼承了父類的所有方法,但是因為方法同名,所以子類方法覆蓋了父類的方法。但是由于是通過SON類來實例,所以肯定要先實例化父類,直接進去父類的無參數構造方法,此時name并沒有值是null,所以whoAmI()方法產生了Son says, I am null,接著執行tellName(name),此時FATHER會去尋找name的值,此刻name被賦值為FATHER,產生了Son's name is FATHER;執行晚會來SON類里面按照由上到下的順序產生了后面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: 原創一道Java筆試面試題考考大家 2013-04-16 16:54 | 王智鐘
    @hbdrawn
    父類的private String name="FATHER";的變量時不繼承給子類的,是private類型。  回復  更多評論
      
    主站蜘蛛池模板: 久久精品国产亚洲77777| 又爽又高潮的BB视频免费看 | 国产精品亚洲一区二区麻豆| 午夜免费啪视频在线观看| 丁香五月亚洲综合深深爱| 国产精品青草视频免费播放| 久久亚洲av无码精品浪潮| www免费插插视频| 亚洲无av在线中文字幕| 国产精品偷伦视频免费观看了| AV在线亚洲男人的天堂| 在线观看免费黄色网址| 久久精品亚洲综合一品| 中文字幕天天躁日日躁狠狠躁免费| 亚洲精品在线播放视频| 日韩吃奶摸下AA片免费观看| 亚洲欧洲av综合色无码| 亚洲国产成人久久一区久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | sss日本免费完整版在线观看| 色噜噜AV亚洲色一区二区| 最新国产乱人伦偷精品免费网站| 久久久亚洲欧洲日产国码农村| 亚洲w码欧洲s码免费| 亚洲精品V天堂中文字幕| 国产亚洲美日韩AV中文字幕无码成人| a毛片久久免费观看| 亚洲精品在线播放| 国产美女无遮挡免费视频| 国产一级一毛免费黄片| 亚洲精品视频在线播放| 国产精品酒店视频免费看| 十八禁在线观看视频播放免费| 亚洲熟妇色自偷自拍另类| 亚洲 无码 在线 专区| 国产精品视频白浆免费视频| 亚洲av无码专区首页| 国产亚洲综合色就色| 午夜男人一级毛片免费| 人妻在线日韩免费视频| 亚洲日本VA午夜在线电影|