蝸ゼ牜ご赽跑 的Blog
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆分類
Design Patterns(22)
(rss)
Eclipse(2)
(rss)
Hibernate(3)
(rss)
J2ee(2)
(rss)
Java(4)
(rss)
Javascript(3)
(rss)
Linux(2)
(rss)
Maven(1)
(rss)
Oracle(2)
(rss)
SiteMesh(1)
(rss)
Spring(3)
(rss)
Struts2(5)
(rss)
Tomcat(2)
(rss)
XML(2)
(rss)
不得不轉(zhuǎn)(1)
(rss)
想說的話(3)
(rss)
隨筆檔案
2008年9月 (1)
2008年8月 (1)
2008年4月 (1)
2008年3月 (6)
2008年2月 (4)
2008年1月 (2)
2007年12月 (12)
2007年11月 (13)
2007年4月 (6)
2006年12月 (8)
最新隨筆
1.?oracle 行級觸發(fā)器
2.?使用hibernate對oracle數(shù)據(jù)庫中數(shù)據(jù)分頁出現(xiàn)重復記錄
3.?Java正則表達式學習(轉(zhuǎn)載)
4.?何時才能天下無賊?
5.?記錄一道過濾int數(shù)組中相同數(shù)據(jù)并按從小到大的排序的試題
6.?我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義
7.?使用SiteMesh裝飾頁面
8.?使用Maven2構(gòu)建項目
9.?Hibernate構(gòu)架應(yīng)用中常用保存方式區(qū)別(轉(zhuǎn)載)
10.?Struts2攔截器學習
最新評論
1.?re: Struts2+spring2+hibernate3整合方案[未登錄]
能不能給我個原碼啊!菜鳥學習中跪求619562440@qq.com 謝謝
--張
2.?re: 分享一個spring+hibernate的通用分頁類
里面userPage是什么
--暗夜百家
3.?re: Struts2+spring2+hibernate3整合方案
能不能給我發(fā)一份源碼,跪求764263599@qq.com 謝謝
--李浩宇
4.?re: 設(shè)計模式學習筆記(二十一)—Composite模式
謝謝樓主的文章
--向日葵大俠
5.?re: 使用hibernate對oracle數(shù)據(jù)庫中數(shù)據(jù)分頁出現(xiàn)重復記錄
學習了!
--游客
我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義
Posted on 2008-03-20 23:46
flustar
閱讀(3608)
評論(24)
編輯
收藏
所屬分類:
想說的話
第一題:
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ū)懙拇鸢福敃r以為沒錯,因為這完全符合java的語法
1)Something類在實例化的時候,會對成員變量進行初始化,f會被賦值于0,按照語法結(jié)果就是f=0,可是實際上不是。Java編譯器為了減少人犯低級錯誤,對final修飾的變量不會再進行默認初始化,而是強制要求你顯示的賦一個值。Java編譯器考慮的可真周到啊,把它自己的語法都給推翻了。這么低級的程序我是寫不出來,所以我答錯了。
2)這一題按照語法也沒錯了,可是為什么會被編譯不過去呢,說白了原因也就是Java編譯器為我們考慮太周到了,我們?yōu)槭裁匆诔橄箢愔卸x一個抽象方法,我們大家都知道抽象類是不能實例化,定義抽象方法就是為了定義一個子類來繼承該抽象類并實現(xiàn)它的抽象方法,但是題目中給定的抽象方法是private修飾的,也就是說它是不能被繼承的,也就是說我們根本不肯能寫出來一個能實現(xiàn)該抽象方法的類,說的更具體一點也就是這個抽象類被定義的毫無意義。Java編譯器真是太強了,連這個也被考慮到了,反正我是從來沒寫過這么低級的程序,更不會去寫出來一個毫無意義的抽象類。
一句話,這兩道題考得不是final和abstract的語法,因為完全合法,而是語義,也就是Java編程規(guī)范。
PS:關(guān)于為什么final修飾的成員變量不能被默認初始化的問題,我想了很久,終于想明白了。我們大家都知道對象初始化分為三步:
1)默認初始化
2)賦值初始化
3)構(gòu)造方法初始化
如果你在類中定義的是一個普通的成員變量非final成員變量,對該類的對象初始化時,該成員變量會嚴格按照以上三步進行初始化。如果是該類的成員變量是用final修飾的,該類對象初始化時,對該成員變量的初始化按照常規(guī)也應(yīng)該由這三步組成,但是由于final修飾的變量是常量,不能進行二次賦值,所以對該類型的變量初始化只能由其中一步來完成,不能出現(xià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默認初始化為0;
2)程序中并沒有出現(xiàn)交叉,也就是說并沒有進行二次賦值的可能。
但是編譯器為什么不放過它呢?
現(xiàn)在讓我們來假設(shè)一下如果不給f變量不顯示的賦一個值,它一定會被初始化為0,按照final的定義一旦被初始化一個值后就不能修改了,也就是說f的值只能是0了。再想想當初我們?yōu)槭裁匆x一個final修飾的常量,難道僅僅就是為了得到一個默認的不能修改的初始值嗎,這恐怕有違我們當初定義final變量的真正意愿,那么我定義這個final變量又有何意義呢。所以在對對象進行初始化時,發(fā)現(xiàn)對象的成員是用final修飾的就會查看它是否被顯示的賦了值,如果沒有就會不能正常編譯。這也是Java編程規(guī)范中為什么要強制對final變量進行顯示賦值的真正原因。同樣的道理在abstract類里面定義private abstract方法,這個又有何意義呢?Java中把那些符合語法但不符合常規(guī)的用法定義成了規(guī)范,我想這也是Java為什么會有編程規(guī)范的原因吧,呵呵,扯遠了。。。
Feedback
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-20 23:56 by
方
太依賴IDE不是一件好事
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 00:11 by
Robin's Java World
這樣的題確實沒有什么實際意義。
這是在做學究。
如果不是做編譯器的開發(fā),我相信這沒什么意義!
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 00:36 by
Empressement Conduct
對于第一題的"Java編譯器為了減少人犯低級錯誤,對final修飾的變量不會再進行默認初始化,而是強制要求你顯示的賦一個值。" 這個可以理解,最起碼讓你不在犯一些錯誤,比如有時忘了初始化,如果它的初值并不是0,那樣不是有錯誤出現(xiàn)么
對于第二題,是有些難于理解,但是不變態(tài)。
既然任何非該類的成員不能訪問該類的任何私有方法,那么Something這個類聲明為抽象類,是毫無意義;可是“abstract 類的任何子類必須實現(xiàn)在父類中定義聲明的所有abstract 方法,如果子類不去實現(xiàn),那么子類必須聲明為abstract 類。”
所以,這個題是毫無意義,但是不變態(tài)。
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 00:41 by
Empressement Conduct
他們面試是為了考驗?zāi)愕幕A(chǔ)知識是否扎實,出一個毫無意義的題,也肯定是有目的,所以你就要想到他們?yōu)槭裁匆o出個毫無意義的題,究竟是什么目的,這個毫無意義的題,究竟從正面和側(cè)面還有反面都能反應(yīng)出些什么問題來,這些都要去想一想
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 00:42 by
xdcsoft
面試是這樣的?沒什么好講的
你認為變態(tài)吧,他也認為你連這個基礎(chǔ)都不知道
我實事論事啊
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 00:48 by
apache
雖然沒什么意義,但不算變態(tài).
第二題很明顯不符合面向?qū)ο笏枷?
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 01:16 by
阿光
第一道題確實覺得很意外,.呵呵,學到知識了.
第二道題就很正常了.abstract嘛,博主基礎(chǔ)知識還不行呀,得加強加強.
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 02:31 by
王小二
同學,你真的是學藝不精啊!
final int f;
人家考的是final這個關(guān)鍵字的意義,你連考點都不知道,還對出題的人……
因為final是一個定義編譯期常量,所以必須賦值。而且出題的人已經(jīng)很厚道了,他沒有通過考你接口中 定義域可能出現(xiàn)的問題,來測試你對final的理解就已經(jīng)不錯了。
你自己做人要厚道,還有那些不懂裝懂的留言者,也附和說什么……
看看《thinking in java》吧
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 08:10 by
Matthew Chen
個人做的話都不會出錯,ide并不會造成學習上的問題,因為我以前都試過用ide寫各種各樣的代碼,也出過類似的問題,一句話,從語言本身健壯性所賦予的行為,很容易理解的。
#
re: 今天遇到的兩道比較變態(tài)的面試題[未登錄]
回復
更多評論
2008-03-21 09:27 by
allenny
很多公司面試喜歡用這樣的題,不管面試的是什么職位,好像他們很有水平。
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 09:37 by
raof01
@Empressement Conduct
同意你!
第一題的確變態(tài),摳細節(jié)~計算機科學里細節(jié)多了,要是摳得細的話誰也別想好。第二題就是純粹的面向?qū)ο蟮臇|西,答不對只能說明學藝不精,還得再練練。
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 09:37 by
yangkun
笨蛋
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 09:40 by
逝者如昔
抽象類是不能定義private方法的啊
#
re: 今天遇到的兩道比較變態(tài)的面試題[未登錄]
回復
更多評論
2008-03-21 09:45 by
roy
暈。。。基礎(chǔ)知識不過關(guān)還說人BT。。。
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 09:52 by
飄然
這個,只能說這兩個題比較扣細節(jié),但是如果編程經(jīng)驗比較豐富,應(yīng)該可以應(yīng)付過來的。
第一道題我在編程開發(fā)中實際遇到過,“Java編譯器考慮的可真周到啊,把它自己的語法都給推翻了。”呵呵,能說出這句話的,只能說樓主你對java的認識還遠不夠,連final的用法都沒有理解。
第二道題就不說了,還是那句話,沒有編程經(jīng)驗和oo的常識。private + abstract,你讓基類怎么實現(xiàn)?
這兩個題雖然都不是可以一眼就看出答案的那種,但是稍微細想一下都可以推出來的。
另外:真正變態(tài)的題目樓主應(yīng)該還沒有見識過,我只能說上面這兩個相比只是小兒科。
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
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)的面試題[未登錄]
回復
更多評論
2008-03-21 10:46 by
咖啡
看來你的經(jīng)驗還是不夠啊.應(yīng)該想想沒有那么簡單才對阿
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 12:22 by
ITAX
不是刺激LZ,我覺得這兩道題太簡單了。簡單到其實是白送分的。(第一題我進現(xiàn)在的公司就做過.......)
其實這些問題非常基礎(chǔ)的,對于我這個看完Thinking in Java好幾年的人都記得書里清楚的寫了。建議LZ再好好看看基礎(chǔ)為好。
#
re: 今天遇到的兩道比較變態(tài)的面試題
回復
更多評論
2008-03-21 14:25 by
flustar
其實面試回來我就意識到自己太大意了,既然是查錯,肯定有錯誤,我怎么能說它沒錯呢 哎!~
第二題,定義一個抽象類,里面有個私有的抽象方法,抽象類不能被實例化,子類繼承該抽象類也不能實例化,因為它不能實現(xiàn)父類的抽象方法。也就是說這個抽象類被定義的一點意義也沒有。我也知道這道題很簡單,簡單到白送分,可是當你做了長達8頁的試卷之后,再來看這個題,我眼睛都花了,頭腦發(fā)脹,哪還有心思想那么多。
第一題,考察的是final變量的用法,何為final變量也就是常量,一旦被賦值后就不能再賦值的變量。可是題目中并沒有對它進行二次賦值啊,第一次賦值應(yīng)該是該類進行實例化時,成員變量f的值被初始化為0。誰知道final類型的成員變量不能被自動初始化啊。如果你不是以前在哪個地方看到過,你能做出來,這樣東西除非你看過或者以前犯過這么低級的錯誤,才知道。我犯過,現(xiàn)在我就知道了。
可是讓我不明白的是為什么用final修飾的成員變量不能被自動初始化,有誰知道,記得告訴我啊!
#
re: 今天遇到的兩道毫無意義的面試題
回復
更多評論
2008-03-21 16:21 by
ZelluX
@flustar
final被賦值后不是不能修改了嗎。。。
那對這個變量的初始化賦值還有什么意義呢?
#
re: 今天遇到的兩道毫無意義的面試題
回復
更多評論
2008-03-21 16:38 by
路人乙
@flustar
為什么問得很沒意義,規(guī)則!
#
re: 今天遇到的兩道毫無意義的面試題
回復
更多評論
2008-03-21 20:03 by
Empressement Conduct
這位朋友,謝謝了啊!!
呵呵,今天翻閱資料發(fā)現(xiàn)自己昨天留言有錯誤,
final修飾符可應(yīng)用于類、方法、和變量。final變量的內(nèi)容不能更改,因此,聲明final變量時,必須將其初始化。
準備糾正時發(fā)現(xiàn)你的留言已經(jīng)糾正了,
呵呵,再次感謝啊,本人也是初學Java,希望以后多多交流。
@王小二
#
re: 我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義
回復
更多評論
2008-03-23 15:37 by
王小二
^ _ ^
#
re: 我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義
回復
更多評論
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
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
何時才能天下無賊?
記錄一道過濾int數(shù)組中相同數(shù)據(jù)并按從小到大的排序的試題
我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義
公告
本blog文章大都是作者學習之余所做,加上本人資歷尚淺,對某些問題的理解可能存在疏漏之處,望高手們多多批評指正,同時也希望在此,多結(jié)交一些朋友。
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
參考鏈接
IBM developerWorks
JavaEye
JavaWorld
Java開源大全
Java文檔大全
Java程序員精粹
Linux伊甸園
SVN中文站
UML軟件工程組織
中國JAVA實驗室
牛人的blog
評論排行榜
1.?Struts2+spring2+hibernate3整合方案(44)
2.?使用TOMCAT5.5連接池連接mysql(解決Cannot create JDBC driver of class '' for connect URL 'null')(28)
3.?我現(xiàn)在才發(fā)現(xiàn)我那天遇到的兩道面試題不但不變態(tài)而且還很有意義(24)
4.?Struts2中使用Common-FileUpload實現(xiàn)文件上傳(9)
5.?分享一個spring+hibernate的通用分頁類(6)
閱讀排行榜
1.?使用TOMCAT5.5連接池連接mysql(解決Cannot create JDBC driver of class '' for connect URL 'null')(51593)
2.?Struts2+spring2+hibernate3整合方案(33797)
3.?Struts2中使用Common-FileUpload實現(xiàn)文件上傳(9662)
4.?Struts2中有關(guān)struts-default.xml,struts.xml,struts.properties文件詳解(7037)
5.?Struts2中Action詳解(5978)
posts - 146, comments - 143, trackbacks - 0, articles - 0
Copyright © flustar
主站蜘蛛池模板:
免费观看无遮挡www的视频
|
亚洲av无码成人影院一区
|
中文字幕在线免费播放
|
鲁啊鲁在线视频免费播放
|
337p日本欧洲亚洲大胆精品555588
|
99久久精品国产亚洲
|
亚洲福利精品电影在线观看
|
免费v片在线观看品善网
|
丁香亚洲综合五月天婷婷
|
亚洲国产成人爱av在线播放
|
国产精品亚洲综合专区片高清久久久
|
国拍在线精品视频免费观看
|
欧美a级在线现免费观看
|
成年女人毛片免费播放视频m
|
免费看a级黄色片
|
又粗又大又长又爽免费视频
|
亚洲综合久久夜AV
|
精品亚洲永久免费精品
|
亚洲综合成人网在线观看
|
亚洲成a人片7777
|
亚洲国产成人无码AV在线影院
|
免费播放美女一级毛片
|
久久成人18免费网站
|
免费视频精品一区二区三区
|
亚洲日本在线免费观看
|
妞干网在线免费视频
|
亚洲精品在线免费观看
|
免费一本色道久久一区
|
波多野结衣免费视频观看
|
国产亚洲av人片在线观看
|
亚洲视频日韩视频
|
亚洲丶国产丶欧美一区二区三区
|
污视频网站免费在线观看
|
国产亚洲男人的天堂在线观看
|
四虎必出精品亚洲高清
|
美女裸体无遮挡免费视频网站
|
A毛片毛片看免费
|
中文毛片无遮挡高潮免费
|
日本特黄特色aa大片免费
|
久久精品亚洲男人的天堂
|
亚洲美女自拍视频
|