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

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

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

    第一題:
       class Something{
            final int f;
          public void doSomething(){
                System.out.println("f="+f)
            }
        }
    第二題:
        abstract class Something{
            private abstract void doSomething();
        }
    為什么毫無意義?我先給出我最初的答案
    1)f=0
    2)沒有錯誤
    這是我面試的時候?qū)懙拇鸢福?dāng)時以為沒錯,因?yàn)檫@完全符合java的語法
    1)Something類在實(shí)例化的時候,會對成員變量進(jìn)行初始化,f會被賦值于0,按照語法結(jié)果就是f=0,可是實(shí)際上不是。Java編譯器為了減少人犯低級錯誤,對final修飾的變量不會再進(jìn)行默認(rèn)初始化,而是強(qiáng)制要求你顯示的賦一個值。Java編譯器考慮的可真周到啊,把它自己的語法都給推翻了。這么低級的程序我是寫不出來,所以我答錯了。
    2)這一題按照語法也沒錯了,可是為什么會被編譯不過去呢,說白了原因也就是Java編譯器為我們考慮太周到了,我們?yōu)槭裁匆诔橄箢愔卸x一個抽象方法,我們大家都知道抽象類是不能實(shí)例化,定義抽象方法就是為了定義一個子類來繼承該抽象類并實(shí)現(xiàn)它的抽象方法,但是題目中給定的抽象方法是private修飾的,也就是說它是不能被繼承的,也就是說我們根本不肯能寫出來一個能實(shí)現(xiàn)該抽象方法的類,說的更具體一點(diǎn)也就是這個抽象類被定義的毫無意義。Java編譯器真是太強(qiáng)了,連這個也被考慮到了,反正我是從來沒寫過這么低級的程序,更不會去寫出來一個毫無意義的抽象類。
    一句話,這兩道題考得不是final和abstract的語法,因?yàn)橥耆戏ǎ钦Z義,也就是Java編程規(guī)范。
     PS:關(guān)于為什么final修飾的成員變量不能被默認(rèn)初始化的問題,我想了很久,終于想明白了。我們大家都知道對象初始化分為三步:
    1)默認(rèn)初始化
    2)賦值初始化
    3)構(gòu)造方法初始化
    如果你在類中定義的是一個普通的成員變量非final成員變量,對該類的對象初始化時,該成員變量會嚴(yán)格按照以上三步進(jìn)行初始化。如果是該類的成員變量是用final修飾的,該類對象初始化時,對該成員變量的初始化按照常規(guī)也應(yīng)該由這三步組成,但是由于final修飾的變量是常量,不能進(jìn)行二次賦值,所以對該類型的變量初始化只能由其中一步來完成,不能出現(xiàn)交叉,否則會有編譯錯誤。下面是兩個可以正常編譯、運(yùn)行的寫法:
    /**
     * 
     * 
    @author <a href="mailto:flustar2008@163.com">flustar</a>
     * 
    @version 1.0 Creation date: Mar 22, 2008 7:18:18 PM
     
    */

    public class TestFinal {
        
    final int f=1;
        
    public void doSomething() {
            System.out.println(
    "f=" + f);
        }

        
    public static void main(String args[]) {
            TestFinal test 
    = new TestFinal();
            test.doSomething();
        }

    }

    /**
     * 
     * 
    @author <a href="mailto:flustar2008@163.com">flustar</a>
     * 
    @version 1.0 Creation date: Mar 22, 2008 7:18:18 PM
     
    */

    public class TestFinal {
        
    final int f;
        
    public TestFinal(){
            f
    =1;
        }

        
    public void doSomething() {
            System.out.println(
    "f=" + f);
        }

        
    public static void main(String args[]) {
            TestFinal test 
    = new TestFinal();
            test.doSomething();
        }

    }
    下面再讓我們回過頭來看看下面這個程序它完全符合Java的語法:
    class Something{
            
    final int f;
          
    public void doSomething(){
                System.out.println(
    "f="+f)
            }

        }

    為什么說它完全符合語法:
    1)按照常理會對f默認(rèn)初始化為0;
    2)程序中并沒有出現(xiàn)交叉,也就是說并沒有進(jìn)行二次賦值的可能。
    但是編譯器為什么不放過它呢?
    現(xiàn)在讓我們來假設(shè)一下如果不給f變量不顯示的賦一個值,它一定會被初始化為0,按照final的定義一旦被初始化一個值后就不能修改了,也就是說f的值只能是0了。再想想當(dāng)初我們?yōu)槭裁匆x一個final修飾的常量,難道僅僅就是為了得到一個默認(rèn)的不能修改的初始值嗎,這恐怕有違我們當(dāng)初定義final變量的真正意愿,那么我定義這個final變量又有何意義呢。所以在對對象進(jìn)行初始化時,發(fā)現(xiàn)對象的成員是用final修飾的就會查看它是否被顯示的賦了值,如果沒有就會不能正常編譯。這也是Java編程規(guī)范中為什么要強(qiáng)制對final變量進(jìn)行顯示賦值的真正原因。同樣的道理在abstract類里面定義private abstract方法,這個又有何意義呢?Java中把那些符合語法但不符合常規(guī)的用法定義成了規(guī)范,我想這也是Java為什么會有編程規(guī)范的原因吧,呵呵,扯遠(yuǎn)了。。。

    Feedback

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-20 23:56 by
    太依賴IDE不是一件好事

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 00:11 by Robin's Java World
    這樣的題確實(shí)沒有什么實(shí)際意義。
    這是在做學(xué)究。
    如果不是做編譯器的開發(fā),我相信這沒什么意義!

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 00:36 by Empressement Conduct
    對于第一題的"Java編譯器為了減少人犯低級錯誤,對final修飾的變量不會再進(jìn)行默認(rèn)初始化,而是強(qiáng)制要求你顯示的賦一個值。" 這個可以理解,最起碼讓你不在犯一些錯誤,比如有時忘了初始化,如果它的初值并不是0,那樣不是有錯誤出現(xiàn)么

    對于第二題,是有些難于理解,但是不變態(tài)。
    既然任何非該類的成員不能訪問該類的任何私有方法,那么Something這個類聲明為抽象類,是毫無意義;可是“abstract 類的任何子類必須實(shí)現(xiàn)在父類中定義聲明的所有abstract 方法,如果子類不去實(shí)現(xiàn),那么子類必須聲明為abstract 類。”
    所以,這個題是毫無意義,但是不變態(tài)。

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 00:41 by Empressement Conduct
    他們面試是為了考驗(yàn)?zāi)愕幕A(chǔ)知識是否扎實(shí),出一個毫無意義的題,也肯定是有目的,所以你就要想到他們?yōu)槭裁匆o出個毫無意義的題,究竟是什么目的,這個毫無意義的題,究竟從正面和側(cè)面還有反面都能反應(yīng)出些什么問題來,這些都要去想一想

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 00:42 by xdcsoft
    面試是這樣的?沒什么好講的
    你認(rèn)為變態(tài)吧,他也認(rèn)為你連這個基礎(chǔ)都不知道
    我實(shí)事論事啊

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 00:48 by apache
    雖然沒什么意義,但不算變態(tài).
    第二題很明顯不符合面向?qū)ο笏枷?

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 01:16 by 阿光
    第一道題確實(shí)覺得很意外,.呵呵,學(xué)到知識了.
    第二道題就很正常了.abstract嘛,博主基礎(chǔ)知識還不行呀,得加強(qiáng)加強(qiáng).

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 02:31 by 王小二
    同學(xué),你真的是學(xué)藝不精啊!
    final int f;
    人家考的是final這個關(guān)鍵字的意義,你連考點(diǎn)都不知道,還對出題的人……
    因?yàn)閒inal是一個定義編譯期常量,所以必須賦值。而且出題的人已經(jīng)很厚道了,他沒有通過考你接口中 定義域可能出現(xiàn)的問題,來測試你對final的理解就已經(jīng)不錯了。
    你自己做人要厚道,還有那些不懂裝懂的留言者,也附和說什么……
    看看《thinking in java》吧

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 08:10 by Matthew Chen
    個人做的話都不會出錯,ide并不會造成學(xué)習(xí)上的問題,因?yàn)槲乙郧岸荚囘^用ide寫各種各樣的代碼,也出過類似的問題,一句話,從語言本身健壯性所賦予的行為,很容易理解的。

    # re: 今天遇到的兩道比較變態(tài)的面試題[未登錄]  回復(fù)  更多評論   

    2008-03-21 09:27 by allenny
    很多公司面試喜歡用這樣的題,不管面試的是什么職位,好像他們很有水平。

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 09:37 by raof01
    @Empressement Conduct
    同意你!
    第一題的確變態(tài),摳細(xì)節(jié)~計算機(jī)科學(xué)里細(xì)節(jié)多了,要是摳得細(xì)的話誰也別想好。第二題就是純粹的面向?qū)ο蟮臇|西,答不對只能說明學(xué)藝不精,還得再練練。

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 09:37 by yangkun
    笨蛋

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 09:40 by 逝者如昔
    抽象類是不能定義private方法的啊

    # re: 今天遇到的兩道比較變態(tài)的面試題[未登錄]  回復(fù)  更多評論   

    2008-03-21 09:45 by roy
    暈。。。基礎(chǔ)知識不過關(guān)還說人BT。。。

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 09:52 by 飄然
    這個,只能說這兩個題比較扣細(xì)節(jié),但是如果編程經(jīng)驗(yàn)比較豐富,應(yīng)該可以應(yīng)付過來的。

    第一道題我在編程開發(fā)中實(shí)際遇到過,“Java編譯器考慮的可真周到啊,把它自己的語法都給推翻了。”呵呵,能說出這句話的,只能說樓主你對java的認(rèn)識還遠(yuǎn)不夠,連final的用法都沒有理解。

    第二道題就不說了,還是那句話,沒有編程經(jīng)驗(yàn)和oo的常識。private + abstract,你讓基類怎么實(shí)現(xiàn)?

    這兩個題雖然都不是可以一眼就看出答案的那種,但是稍微細(xì)想一下都可以推出來的。

    另外:真正變態(tài)的題目樓主應(yīng)該還沒有見識過,我只能說上面這兩個相比只是小兒科。

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 10:42 by ZelluX
    很正常啊,初始化final字段和私有的抽象方法邏輯上都不應(yīng)該存在的。

    可以看看Java Language Specification
    8.4.3.1
    It is a compile-time error for a private method to be declared abstract.

    # re: 今天遇到的兩道比較變態(tài)的面試題[未登錄]  回復(fù)  更多評論   

    2008-03-21 10:46 by 咖啡
    看來你的經(jīng)驗(yàn)還是不夠啊.應(yīng)該想想沒有那么簡單才對阿

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 12:22 by ITAX
    不是刺激LZ,我覺得這兩道題太簡單了。簡單到其實(shí)是白送分的。(第一題我進(jìn)現(xiàn)在的公司就做過.......)
    其實(shí)這些問題非常基礎(chǔ)的,對于我這個看完Thinking in Java好幾年的人都記得書里清楚的寫了。建議LZ再好好看看基礎(chǔ)為好。

    # re: 今天遇到的兩道比較變態(tài)的面試題  回復(fù)  更多評論   

    2008-03-21 14:25 by flustar
    其實(shí)面試回來我就意識到自己太大意了,既然是查錯,肯定有錯誤,我怎么能說它沒錯呢 哎!~
    第二題,定義一個抽象類,里面有個私有的抽象方法,抽象類不能被實(shí)例化,子類繼承該抽象類也不能實(shí)例化,因?yàn)樗荒軐?shí)現(xiàn)父類的抽象方法。也就是說這個抽象類被定義的一點(diǎn)意義也沒有。我也知道這道題很簡單,簡單到白送分,可是當(dāng)你做了長達(dá)8頁的試卷之后,再來看這個題,我眼睛都花了,頭腦發(fā)脹,哪還有心思想那么多。
    第一題,考察的是final變量的用法,何為final變量也就是常量,一旦被賦值后就不能再賦值的變量。可是題目中并沒有對它進(jìn)行二次賦值啊,第一次賦值應(yīng)該是該類進(jìn)行實(shí)例化時,成員變量f的值被初始化為0。誰知道final類型的成員變量不能被自動初始化啊。如果你不是以前在哪個地方看到過,你能做出來,這樣?xùn)|西除非你看過或者以前犯過這么低級的錯誤,才知道。我犯過,現(xiàn)在我就知道了。
    可是讓我不明白的是為什么用final修飾的成員變量不能被自動初始化,有誰知道,記得告訴我啊!

    # re: 今天遇到的兩道毫無意義的面試題  回復(fù)  更多評論   

    2008-03-21 16:21 by ZelluX
    @flustar
    final被賦值后不是不能修改了嗎。。。
    那對這個變量的初始化賦值還有什么意義呢?

    # re: 今天遇到的兩道毫無意義的面試題  回復(fù)  更多評論   

    2008-03-21 16:38 by 路人乙
    @flustar
    為什么問得很沒意義,規(guī)則!

    # re: 今天遇到的兩道毫無意義的面試題  回復(fù)  更多評論   

    2008-03-21 20:03 by Empressement Conduct
    這位朋友,謝謝了啊!!
    呵呵,今天翻閱資料發(fā)現(xiàn)自己昨天留言有錯誤,
    final修飾符可應(yīng)用于類、方法、和變量。final變量的內(nèi)容不能更改,因此,聲明final變量時,必須將其初始化。
    準(zhǔn)備糾正時發(fā)現(xiàn)你的留言已經(jīng)糾正了,
    呵呵,再次感謝啊,本人也是初學(xué)Java,希望以后多多交流。
    @王小二

    # re: 我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義  回復(fù)  更多評論   

    2008-03-23 15:37 by 王小二
    ^ _ ^

    # re: 我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義  回復(fù)  更多評論   

    2008-04-09 00:41 by stanleyxu
    I think it is nonsense. If it can be compiled or not, is the job of javac.exe.
    If I were employer, I might ask:
    1. What is the difference between list and array.
    2. What is the difference between abstraction and interface.
    3. String manipulation etc.

    Anyway, you will collect more and more experience while doing real programming. Good luck

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 亚洲精品天堂成人片?V在线播放| 亚洲精品女同中文字幕| 亚洲成av人片天堂网老年人| 亚洲成年人免费网站| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲字幕在线观看| 亚洲欧洲精品无码AV| 免费人妻无码不卡中文字幕18禁| 中文字幕无码播放免费| 久久aⅴ免费观看| 9久久免费国产精品特黄| 美女的胸又黄又www网站免费| 亚洲校园春色另类激情| 亚洲一区二区电影| 亚洲AV无码专区国产乱码4SE| 久久精品国产精品亚洲艾草网美妙| 最新69国产成人精品免费视频动漫| 蜜桃AV无码免费看永久| 免费人成在线观看网站品爱网| 中文在线免费不卡视频| 一区二区免费在线观看| 黄色免费网站在线看| 自拍偷自拍亚洲精品播放| 亚洲国产成人久久精品大牛影视| 亚洲一区欧洲一区| 亚洲精品国产国语| 亚洲成A人片在线播放器| 亚洲av乱码一区二区三区香蕉| 久久亚洲日韩看片无码| 亚洲av日韩av无码黑人| 亚洲va无码专区国产乱码| 国产精品亚洲片在线| 久热综合在线亚洲精品| 亚洲综合国产精品| 色婷婷六月亚洲婷婷丁香| 亚洲一区二区三区日本久久九| 亚洲资源在线观看| 亚洲免费二区三区| 亚洲中文无码永久免| 亚洲aⅴ天堂av天堂无码麻豆| 国产AV无码专区亚洲AV蜜芽|