面試經(jīng)常問一些模棱兩可的問題,也就是一些在一些條件成立時,才能給出確定答案的問題。
比如問Java是否支持多繼承。那么回答要縝密,接口支持,類不支持。
多繼承導(dǎo)致網(wǎng)狀繼承結(jié)構(gòu)。
? F????????????F
soft????????? bed
????softbed
F這層的成員變量會在softbed會出現(xiàn)兩份。
所以在C++中采用虛繼承來解決,達(dá)到了一種菱形結(jié)構(gòu)。
?????????F
soft?????????bed
??????softbed
還有一點,就是F層的成員方法(不支持多態(tài)的方法),在soft和bed中都有。
Java所有方法都是virtual的
內(nèi)存結(jié)構(gòu)
---------------------------
???Data? [C++中是全局變量和static,Java中是static]
---------------------------
?? Code [代碼區(qū)是共享的]
---------------------------
?? Heap
---------------------------
?? Stack
---------------------------
Java的接口,那都是指針表,只有在運行時,才能確定每個方法的具體指向。
所以在IDE中,在一定代碼中,右鍵點擊一個接口的引用,尋找definition的時候,只能定位到接口,不能定義到具體實現(xiàn)類,因為在IDE中能確定編譯時的類型。
=================================================
Java修飾符號最后總結(jié)。
問class的修飾符有幾種?
縝密回答,如果是頂級類,只有兩種public 和 default。如果是內(nèi)部類(成員內(nèi)部類)就可以有四種。
new Outer().new Outer.Inner();
局部內(nèi)部類是只能訪問final的局部變量。
匿名內(nèi)部類肯定是繼承一個現(xiàn)有類型的類,或者實現(xiàn)一個現(xiàn)有接口。
靜態(tài)內(nèi)部類也是一個頂級類,不依賴于外部類的實例,只能訪問外部類的靜態(tài)成員變量,就好像靜態(tài)方法。
C++中的嵌套類只相當(dāng)于Java的靜態(tài)內(nèi)部類。
=========================
final和abstract是互斥的!絕對不能出現(xiàn)在一起。
final的變量可以在構(gòu)造器中修改,因為Java沒有想C++的初始化列表。
類型和名字在一起是核心原則,其他修飾符順序可以隨便變。
<modifiers><return-type><name>[argument_list][throws ...]
native與abstract也肯定互斥。
記住,書寫習(xí)慣是很重要的。因為可以認(rèn)為代碼中“如果占居的位置一樣,那么享受的權(quán)利就一樣”
=========================
IdentityMap只用==排序。
List和Set的選擇,在Hibernate和CMP中有用到,而且區(qū)別比較大。以后總結(jié)
=========================
線程相關(guān)函數(shù),
sleep()可以出現(xiàn)在非Synchronized塊中。而wait()肯定是Synchronized塊中,因為此操作會釋放鎖。
都會跑出InterruppptedException。
----------------------------------------
線程加鎖問題,困擾著軟件開發(fā)人員。
T1 --------------------〉數(shù)據(jù) <--------------------------T2
???????????????????????????那么就在數(shù)據(jù)這邊加鎖唄。
在共享的對象類型中加減鎖,在可讀可寫成員變量加減鎖。
在訪問static變量,加鎖,訪問相同外部資源加鎖
在有讀寫兩個方法,比如生產(chǎn)者,消費者問題,就要在加鎖方法中添加wait和notify操作。
~~~~~~~~~~~~~~~~~~~~~~~~~~
實際上,在J2EE開發(fā)中,我們在做什么呢,實際上就是在編寫數(shù)據(jù)那部分的代碼。
Servlet,是什么,就是很多線程共享的一個數(shù)據(jù)對象,有相關(guān)的服務(wù)方法。
所以不建議在Servlet中寫成員變量,因為有數(shù)據(jù)同步問題。
所以一般,都是在方法中定義局部變量,[在這說一句,為什么局部變量沒有數(shù)據(jù)同步問題呢,那是因為對于每一個開啟的Thread,都會從進(jìn)程的棧區(qū)分化出一部分做本線程的獨立棧區(qū)分配給局部變量]
SingleThreadModel已經(jīng)被單獨廢除,因為此接口不能避免數(shù)據(jù)同步問題,因為即使一個Servlet類型可以創(chuàng)建多個實例,對于成員變量沒有線程同步問題,但是如果在Servlet中操作共享對象,比如ServletContext,就完蛋了,或者是靜態(tài)變量,和其他共享資源都要保護(hù)。
~~~~~~~~~~~~~~~~~~~~~~~~~~
IO 相關(guān)
byte[]????????????????? InputStream????????????????????????OutStream
primitive???????????????DataInputStream???????????????????????????DataOutputStream
String
字符???????????????????Reader?????????????????????????????????Writer
InputStream和OutStream因為不能確定源和目的地,所以都是抽象的。
在字節(jié)流和字符流之間必須要有個橋轉(zhuǎn)換,也就是Reader的構(gòu)建需要一個InputStreamReader(InputStream,charset);
這里指的字符集是指JVM外部的編碼方式。
外部編碼方式---------------IN----------->JVM(UNICODE)-------------OUT------------->外部編碼方式
Exception????????????????????????????RuntimeException
如果自定義異常是繼承RuntimeException,就是表明如果在此處跑出這樣的異常,其他地方是沒有什么辦法進(jìn)行修復(fù)的,也就是調(diào)用方無辦法。
而已檢查異常則是,可以修復(fù)的異常。比如用戶驗證等,可以讓用戶在此輸入用戶名和密碼。
最好也將運行時異常也聲明在方法簽名中。
============================
JDBC,驅(qū)動有四類,就是對已有ODBC的橋接,對Pro*C的本地C函數(shù)的調(diào)用,通過專有數(shù)據(jù)庫協(xié)議,通過獨立的協(xié)議,但需要在單獨的一個Server進(jìn)行轉(zhuǎn)換。
分頁顯示的實現(xiàn),可以從兩個角度來做,一個SQL,一個是JDBC API,
































































































































































































































============================

方框就是Attribute。
實際上還有Session的Map,有Session和一個ID,而這個ID被作為一個hook鉤子放置于Cookie中,使得瀏覽器與Session對應(yīng)上,屏蔽了Http無狀態(tài)的弊端。
===========
監(jiān)聽器分為對于Session,Request,Application的生命周期的監(jiān)聽器和屬性添加刪除的監(jiān)聽器。
對于Session還有一個就是跟群集有關(guān)的,在FailOver的時候,要對Session 進(jìn)行網(wǎng)絡(luò)傳輸?shù)絺溆迷O(shè)備上,那么屬性和需要支持串行化,對于不能串行化的資源,比如數(shù)據(jù)庫連接,需要有一個時機(jī)來斷開和重新獲得,那么就有HttpSessionActivationListener。
?void | sessionDidActivate(HttpSessionEvent?se) ??????????Notification that the session has just been activated. |
?void | sessionWillPassivate(HttpSessionEvent?se) ??????????Notification that the session is about to be passivated |
Struts和EJB,都是API依賴,都是基于繼承多態(tài)的框架,移植性降低。
而Spring和Hibernate基于反射,弊端是依賴于配置,配置文件多,調(diào)試?yán)щy,因為都是要在運行時才能確定配置是否正確。