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

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

        }

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

    Feedback

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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ù)  更多評(píng)論   

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

    主站蜘蛛池模板: 亚洲A丁香五香天堂网| 97久久国产亚洲精品超碰热| 欧洲乱码伦视频免费| 一级成人生活片免费看| 国产亚洲玖玖玖在线观看| 精品亚洲一区二区| 日本成人在线免费观看| 99久9在线|免费| 一二三区免费视频| 好男人资源在线WWW免费| 羞羞视频在线免费观看| 亚洲狠狠成人综合网| 亚洲一线产区二线产区区| 亚洲综合网美国十次| 亚洲精品无码不卡在线播HE| 伊人久久亚洲综合影院| 成人毛片免费观看视频在线| 亚洲毛片免费视频| 99久热只有精品视频免费观看17| 久久久免费的精品| 国产羞羞的视频在线观看免费| 一级做a爰片久久毛片免费陪| 亚洲第一成年网站视频| 亚洲AV无码专区在线亚| 亚洲精品永久www忘忧草| 亚洲av日韩av综合| 添bbb免费观看高清视频| 亚洲成无码人在线观看| 亚洲电影免费在线观看| 国产成人精品日本亚洲网站| 亚洲国产一区国产亚洲| 久久精品国产亚洲AV麻豆~| 亚洲无线观看国产精品| 亚洲色大成网站www永久一区| 亚洲毛片在线观看| 亚洲色大成WWW亚洲女子| 亚洲阿v天堂在线2017免费| 丁香六月婷婷精品免费观看| 日韩免费在线视频| 在线看无码的免费网站| 成人免费黄色网址|