親身經歷,Java面試題整理
博主在2015年暑期參加過一些Java開發工程師實習的面試和筆試,在此將重點整理出來,以供大家學習。
資料1:
一、單繼承
1.1Java類是否支援多重繼承?
答: Java的類是單繼承的,不支援多繼承,即extends關鍵字後只能有一個類名稱,即直接父類。因此Java的類繼承關係形成一個樹型結構,而不是網狀結構。 要想實現類似於C++的多繼承關係,Java是通過介面間接實現的,即多個父類實現某一介面,每個父介面有子介面,子類實現子介面。
1.2Java類是否可以同時實現多個介面?
答:可以,用逗號分隔多個介面即可。介面只能繼承多個介面。java中介面其實裡面全是抽象類 ,抽象類就是隻有方法名,方法體沒有 ,也就是說方法沒有實現, 介面可以繼承多個介面,而類可以實現多個介面,你實現一個介面,相當於從它那裡可以得到它的抽象方法。而自己也可以增加自己的方法。
Interface 子介面 extends 父介面1,父介面2,。。。。。。。。
1.3一個介面是否可以同時繼承多個介面?
答:一個介面可以繼承多個介面.interface C extends A, B {}是可以的.
一個類可以實現多個介面:class D implements A,B,C{}
但是一個類只能繼承一個類,不能繼承多個類class Bextends A{}
在繼承類的同時,也可以繼承介面:class E extendsD implements A,B,C{}
1.4為什麼類只能單繼承,介面可以多繼承?
答:不允許類多重繼承的主要原因是,如果A同時繼承B和C,而b和c同時有一個D方法,A如何決定該繼承那一個呢?
但介面不存在這樣的問題,介面全都是抽象方法繼承誰都無所謂,所以介面可以繼承多個介面。
二、靜態和成員
2.1成員方法是否可以訪問靜態變數?
2.2為什麼靜態方法不能訪問成員變數?
答:類中的靜態方法與靜態變數都是在類載入的時候進行初始化的,而類中普通方法跟普通變數都是在類例項化的時候才初始化。
由此你的問題就顯而易見了,普通成員方法可以訪問靜態變數是因為普通方法初始化的時候說明類已經在例項化了,此時靜態變數、靜態方法都已經初始化完畢,所以可以訪問。而靜態方法不能訪問普通成員變數是因為靜態方法初始化的時候類並沒有例項化,也就是說此時普通成員變數還沒有初始化,所以不能訪問。
三、內部類
3.1內部類分為幾種?
答:內部類包括靜態巢狀類,成員內部類,方法內部類和匿名內部類四種類型。
3.2匿名內部類是否可以訪問所在方法的引數有什麼要求?
答:引數必須是常量
3.3、為什麼匿名內部類只能訪問常量引數?
答:(因為雖然匿名內部類在方法的內部,但實際編譯的時候,內部類編譯成Outer.Inner,這說明內部類所處的位置和外部類中的方法處在同一個等級上,外部類中的方法中的變數或引數只是方法的區域性變數,這些變數或引數的作用域只在這個方法內部有效。因為編譯的時候內部類和方法在同一級別上,所以方法中的變數或引數只有為final,內部類才可以引用。)
四、StringBuffer與StringBuilder
4.1、以下語句會建立幾個字串物件?
String str = “Hello” + “world” + “have a nice day”;
“Hello”、“world”、“Hello world”、“have a nice day”、“Hello world have a nice day”
4.2、以上程式碼有什麼缺點?有哪些方式可以優化?
(在程式中這樣的語句多的話,會很費記憶體,優化方式是:將其改為String str += “Hello”的格式)
4.3、StringBuffer與StringBuilder的區別是什麼?
(StringBuilder一個可變的字元序列。此類提供一個與 StringBuffer 相容的API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。 StringBuffer 執行緒安全,StringBuilder 執行緒不安全)
五、覆蓋
5.1、什麼是方法的覆蓋?
(在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。 若子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數表,則新方法將覆蓋原有的方法。)
5.2、方法的覆蓋的語法要求是什麼?
答:1.覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
2.覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3.覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;
4.被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
5.3為什麼訪問控制符要求越來越寬泛,異常型別要越來越具體?
答:java類的訪問控制符主要是為了體現面向物件的封裝和繼承的特性的,對於封裝來說越小越好,繼承的話就用protocted關鍵詞,越小別人對你的耦合度就越小,比如private,只有自己能訪問到,這樣如果有變化你可以很好的改變,現在一般的屬性都是private
在java語言中,Exception是所有異常的父類。任何異常都擴充套件於Exception類。Exception就相當於一個錯誤型別。如果要定義一 個新的錯誤型別就擴充套件一個新的Exception子類。採用異常的好處還在於可以精確的定位到導致程式出錯的原始碼位置,並獲得詳細的錯誤資訊。Java異常處理通過五個關鍵字來實現,try,catch,throw ,throws, finally。具體的異常處理結構由try….catch….finally塊來實現。try塊存放可能出現異常的java語句,catch用來捕獲發 生的異常,並對異常進行處理。Finally塊用來清除程式中未釋放的資源。不管理try塊的程式碼如何返回,finally塊都總是被執行。
六、網路層程式設計
6.1、Socket工作在TCP/IP協議棧是哪一層?
(socket的實現部分,就是系統協議棧部分,應該包含了網路層(ip),傳輸層(tcp/udp)等等。用socket寫程式的人,就要看用socket那部分了。如果你直接用ip層,rawsocket,假如你自己寫個tcp協議,那你應該做的就是傳輸層。 如果你是用tcp/udp等協議,做網路應用,那應該是應用層。
6.2、傳輸層常見程式設計協議有哪些?並說出各自的特點。
TCP,UDP,SPX,NetBIOS,NetBEUI
☆ SPX:順序包交換協議,是Novell NetWare網路的傳輸層協議。
☆ TCP:傳輸控制協議,是TCP/IP參考模型的傳輸層協議。
6.3、同一臺機器上的兩個Server程式是否可以使用同一埠?(不可以)
6.4、同一臺機器上的不同協議的兩個Server是否可以使用同一埠?為什麼?
(可以,埠的唯一性的標識不是埠號,而是埠號和協議名稱的組合,應用程式和協議定址時就是靠的這個組合)
七、Web程式設計
7.1、JSP中的宣告指令碼,普通指令碼、表示式指令碼分別用什麼標籤表示?
( 宣告指令碼<%! %>;普通指令碼<% %>;表示式指令碼<%= %>)
7.2、 宣告指令碼中定義的變數和普通指令碼定義的變數有什麼區別?使用時要注意什麼?
全域性變數到處可以用,例如<%!%>宣告的,區域性變數就是隻有函式內部可以用普通指令碼<%%>。 注意:普通指令碼<% %> 裡面的是java程式碼,和普通java類的語法一樣,而在兩個符號外面的都作為html處理。<% java 程式碼 %>在 JSP Scriptlet 裡可直接嵌入任何有效的java語言程式碼。可以在 scriptlet 內部可以使用java。 <%! 宣告 %>在宣告部分可以宣告變數和方法,它們只當前JSP頁面有效。
八、Hibenrate
8.1、一對一關係有哪幾種對映方式?
3種共享主鍵,外來鍵和關聯表
1.共享主鍵的一對一關聯對映
2.外來鍵對映方式(使用外來鍵進行實體一對一關聯)
3..關聯表對映方式
相互關聯關係上的劃分:1)一對一外來鍵關聯對映(單向) 2)一對一外來鍵關聯對映(雙向)3)一對一主鍵關聯對映(不重要)
Hibernate Annotation幾種關聯對映 一對一(One-To-One) 使用@OneToOne註解建立實體Bean之 間的一對一關聯。一對一關聯有三種情況:(1).關聯的實體都共享同樣的主鍵,(2).其中一個實體通過外來鍵關聯到另一個實體的主鍵(注意要模擬一對一關 聯必須在外來鍵列上新增唯一約束),(3).通過關聯表來儲存兩個實體之間的連線關係(要模擬一對一關聯必須在每一個外來鍵上新增唯一約束)。
8.2、什麼時候採用共享主鍵,什麼時候採用唯一外來鍵?
共享主鍵方式:就是限制兩個資料表的主鍵使用相同的值。
唯一外來鍵方式:就是一個表的外來鍵和另一個表的唯一主鍵對應形成一對一對映關係。
1、共享主鍵方式:
在註冊時,往往不但要填寫 登入賬戶和密碼,還要填寫其他的詳細資訊,這兩部分資訊通常會放在不同的表中。這時登入表和詳細資訊表屬於典型的一對一關係,可以按共享主鍵方式進行。
在進行該關聯時要對POJO類的ORM對映檔案*.hbm.xml 進行修改:
如:
Login 表 與 Login 類的ORM對映檔案 Login.hbm.xml 檔案在<class...></class>標籤中新增: <!-- name 表示屬性名字,class表示被關聯的類的名字 -->
<one-to-one name = "detail" class = "org.model.Detail" constrained = "true" /> 而 detail 表 與 Detail 類的 ORM 對映檔案 Detail.hbm.xml 檔案中新增:
<!-- name 表示屬性名,class 表示被 關聯類的名字,cascade = "all" 表明 主控類的所有操作,對關聯類也執行同樣的操作,lazy="false"表示此關聯為立即載入 -->
<one-to-one name = "login" class = "org.model.Login" cascade = "all" lazy = "false" />
2、唯一外來鍵方式:
多對一的特殊情況。
九、OpenSession與getCurrentSession
9.1、OpenSession() 與getCurrentSession() 兩個方法的區別是什麼?
getCurrentSession的話會自動關閉,而openSession需要你手動關閉。
如果你正在查詢,使用的openSession而沒有手動關閉,多次之後會導致連線池溢位,系
統會掛掉的~
1 getCurrentSession建立的session會和繫結到當前執行緒,而openSession不會。
2 getCurrentSession建立的執行緒會在事務回滾或事物提交後自動關閉,而openSession必須手動關閉(呼叫session的close()方法)
3.getCurrentSession () 使用當前的session
openSession() 重新建立一個新的session
4、使用getCurrentSession()需要在hibernate.cfg.xml檔案中加入如下配置:
* 如果使用的是本地事務(jdbc事務) <property name="hibernate.current_session_context_class">thread</property> * 如果使用的是全域性事務(jta事務)
<property name="hibernate.current_session_context_class">jta</property>
9.2、getCurrentSession() 的實現原理是什麼?(ThreadLocal繫結到執行緒)
十、spring
10.1、簡述面向切面程式設計(AOP)的好處。
1.每個業務邏輯放在一個地方(事務管理,日誌管理,安全,其他),避免程式碼分散到各 個角落 2. 業務邏輯更加清晰。AOP只是一種程式設計正規化,用於提供從另一角度來考慮程式結構以完善面向物件程式設計。主要優點有:1-降低模組之間的耦合度。2-使系統容 易擴充套件。3-更好的程式碼複用。解耦合,高內降低耦合。
10.2、Spring中場勇敢的基礎切面有哪些?
許可權判斷、異常處理,日誌記錄,事務管理,安全,效能監測,訪問控制,
10.3、spring切面的實現原理是什麼?
反射實現AOP動態代理模式。
資料2:
1.類一般都儲存在自己的檔案中,並且這個檔案還是和類名一致的。但是巢狀類之間是儲存在一起的。對於巢狀在內部的類,不可以在外部定義一個類去呼叫它!
2.三種情況下方法不能被覆蓋?
答:static方法,final方法和final類中的方法。
3.this關鍵字:
答:可以呼叫本類中的屬性即成員變數以及其它構造方法。加上this.name=name;說明是形參中的name賦值給this.name屬性。
4.Super關鍵字:
答:完成子類在覆蓋了父類中的方法後,呼叫子類所複製的父類的欄位和方法。
5.靜態方法和非靜態方法:
答:(欄位也分為靜態和非靜態倆種)區別如下:
(1)非靜態方法必須在類例項化之後通過物件來呼叫,即:物件名.方法名
靜態方法可以在類例項化之前呼叫,即可以物件名.方法名;也可以類名.方法名
(2)靜態方法訪問本類成員時,只允許訪問靜態方法;而非靜態方法則可以訪問靜態方法和非靜態方法;
(ps類例項化之後就是物件)
6.類的例項化----------物件
答:類是抽象的不能賦值。例項化之後的類即是物件,能夠賦值,而且可以通過物件直接呼叫函式。物件宣告如下:
類名 物件名 = new 類名();
New為例項化物件的關鍵字。
7.抽象類:
答:專門當作父類,抽象方法以及包含抽象方法的類必須用abstract關鍵字修飾。
規則如下:1)用abstract修飾。2)抽象類不能被例項化。3)抽象方法只需宣告,不需要實現。4)含有抽象方法的類必須被稱為抽象類,抽象類的子類必須覆蓋所有的抽象方法後才能被例項化,否則這個子類還是個抽象類。
在抽象類中宣告構造方法後,在子類中必須明確呼叫,否則就出錯。
8.HTTPS和HTTP的區別
超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊。HTTP協議以明文方式傳送內容,不提 供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此HTTP協議不適合傳輸一些敏感資訊, 比如信用卡號、密碼等。
為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議HTTPS。為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。
HTTPS和HTTP的區別主要為以下四點:
一、https協議需要到ca申請證書,一般免費證書很少,需要交費。
二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
三、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
四、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。