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

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

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

    隨筆-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://m.tkk7.com/rongxh7(心夢(mèng)帆影JavaEE技術(shù)博客)
        

    posted on 2009-11-28 03:21 心夢(mèng)帆影 閱讀(4045) 評(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(); 寫這個(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(這里即使是寫了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)樽宇愔貙懥舜朔椒ǎ藭r(shí)Son的name還沒(méi)有構(gòu)造出來(lái)。  回復(fù)  更多評(píng)論
      
    # re: 原創(chuàng)一道Java筆試面試題考考大家 2009-12-08 23:22 | ynyee
    這種寫法只是一種語(yǔ)法,并不能用我們看到的語(yǔ)法加上老師告訴我們的理論來(lái)確定這件事情,我倒覺(jué)得是這是一種編寫代碼的語(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)榉椒ㄍ宰宇惙椒ǜ采w了父類的方法。但是由于是通過(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)論
      
    主站蜘蛛池模板: 成人免费午夜在线观看| 国产一级在线免费观看| 亚洲精品又粗又大又爽A片| 亚洲人6666成人观看| 亚洲成a人片在线观看中文!!!| 中文字幕在线观看亚洲| 亚洲欧洲另类春色校园小说| 中文字幕在线观看亚洲| 久久精品国产亚洲av麻豆图片 | 成年网站免费视频A在线双飞| 免费一级毛片无毒不卡| 久久国产精品免费观看| **真实毛片免费观看| 在线视频精品免费| 毛片视频免费观看| 免费萌白酱国产一区二区| 亚洲av区一区二区三| 中文字幕中韩乱码亚洲大片| 亚洲精品无码国产| 久久丫精品国产亚洲av| 亚洲国产品综合人成综合网站| 中文字幕乱码亚洲无线三区| 色九月亚洲综合网| 国产免费内射又粗又爽密桃视频| 免费无码H肉动漫在线观看麻豆| 久久大香伊焦在人线免费| 免费无码又黄又爽又刺激 | 日本高清不卡aⅴ免费网站| 色欲A∨无码蜜臀AV免费播| 久久午夜夜伦鲁鲁片免费无码影视| 一二三四在线播放免费观看中文版视频| 国产精品视频免费一区二区| 免费在线观看黄网| 亚洲AV无码专区电影在线观看| 亚洲欧洲国产成人精品| 羞羞漫画在线成人漫画阅读免费| 成人免费一区二区三区| 久久精品国产免费观看| 国产精品免费视频网站| 亚洲国产成人精品无码区在线观看 | 24小时日本电影免费看|