常見問題

1、單繼承

 1.1、java類是否支持多重繼承?(不支持,但支持多接口)

 1.2、java類是否可以同時實現多個接口?(可以)

 1.3、一個接口是否可以繼承其它接口?(可以)

 1.4、一個接口是否可以同時繼承多個接口?(可以)

 1.5、爲什麼類只能單繼承而接口可以多集(繼承)成?(類如果多繼承的話,存在不同的類中有相同的方法,調用是會出現混亂,而接口不會出現這種情況)

2、靜態變量

 2.1、普通成員方法是否可以訪問靜態變量?(可以)

 2.2、靜態方法是否可以訪問普通成員變量?(不可以,因爲靜態方法在主程式加載時就已經執行,如果調用普通成員變量,可能變量未初始化,導致出現空指針異常。)

 2.3、爲什麼靜態方法不能訪問普通成員變量?(不可以,

牽扯到類加載與類實例化的問題。類中的靜態方法與靜態變量都是類加載的時候進行初始化的,而類中普通方法跟普通變量都是在類實例化的時候才初始化,普通成員方法可以訪問靜態變量是因爲普通方法初始化的時候說明類已經在實例化了,此時靜態變量、靜態方法都已經初始化完畢,所以可以訪問。而靜態方法不能訪問普通成員變量是因爲靜態方法初始化的時候類並沒有實例化,也就是說此時普通成員變量還沒有初始化,所以不能訪問。java中的普通成員是在new一個對象的時候才產生的,而static成員是編譯這個類的時候就產生了。有一個先後順序。方法同理。所以你寫靜態方法的時候沒有創建對象實例,所以還沒有非靜態的成員,所以不能調用)

 

3、內部類

 3.1、內部類分爲哪幾種?(Java裏分爲匿名內部類,局部內部類,靜態內部類,成員內部類)

 3.2、匿名內部類是否可以訪問所在方法的參數有什麼要求?(參數必須是常量)

 3.3、爲什麼匿名內部類只能訪問常量參數?(因爲雖然匿名內部類在方法的內部,但實際編譯的時候,內部類編譯成Outer.Inner,這說明內部類所處的位置和外部類中的方法處在同一個等級上,外部類中的方法中的變量或參數只是方法的局部變量,這些變量或參數的作用域只在這個方法內部有效。因爲編譯的時候內部類和方法在同一級別上,所以方法中的變量或參數只有爲final,內部類纔可以引用。)

 

4、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”的格式;如對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法。)

 4.3、StringBuffer與StringBuilder的區別是什麼?

 String 字符串常量

 StringBuffer 字符串變量(線程安全,多線程使用)

 StringBuilder 字符串變量(非線程安全,一個可變的字符序列是5.0新增的,不保證同步,單線程使用)

(StringBuilder一個可變的字符序列。此類提供一個與StringBuffer 兼容的API,但不保證同步。該類被設計用作StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比StringBuffer 要快。StringBuffer 線程安全StringBuilder 線程不安全)

 

5、覆蓋(override)

 5.1、什麼是方法的覆蓋?(在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫(override)。方法重寫又稱方法覆蓋。若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。)

 5.2、方法的覆蓋的語法要求是什麼?

  1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

  2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

  3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

  4、被覆蓋的方法不能爲private,否則在其子類中只是新定義了一個方法,並沒有對其進行;

 

 5.3、爲什麼訪問控制符要求越來越寬泛,異常類型要越來越具體?

java類的訪問控制符主要是爲了體現面向對象的封裝和繼承的特的,對於封裝來說越小越好,繼承的話就用protocted關鍵詞,越小別人對你的耦合度就越小,比如private,只有自己能訪問到。訪問控制符越寬泛訪問就越容易;而異常越來越具體捕獲和處理就越容易對程序的性能就更有優勢,對程序員的效率更好

 

6、網絡層編程

 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是否可以使用同一端口?爲什麼?

 可以,端口的唯一性的標識不是端口號,而是端口號和協議名稱的組合,應用程序和協議尋址時就是靠的這個組合

 

7、JSP編程

 7.1、JSP中的聲明腳本,普通腳本、表達式腳本分別用什麼標籤表示?

聲明腳本<%! %>;普通腳本<% %>;表達式腳本<%= %>

 

 7.2、聲明腳本中定義的變量和普通腳本定義的變量有什麼區別?使用時要注意什麼?

全局變量到處可以用,例如<%!%>聲明的,局部變量就是隻有函數內部可以用普通腳本<%%>。

 注意:普通腳本<% %>裏面的是java代碼,和普通java類的語法一樣,而在兩個符號外面的都作爲html處理。<% java 代碼%>在JSP Scriptlet 裏可直接嵌入任何有效的java語言代碼。可以在scriptlet 內部可以使用java。

<%! 聲明 %>在聲明部分可以聲明變量和方法,它們只當前JSP頁面有效。

 

8、關係映射

 8.1、一對一關係有哪幾種映射方式?

3種共享主鍵,外鍵和關聯表:

 1.共享主鍵的一對一關聯映射

 2.外鍵映射方式(使用外鍵進行實體一對一關聯)

 3.關聯表映射方式相互關聯關係上的劃分:

1)一對一外鍵關聯映射(單向)

 2)一對一外鍵關聯映射(雙向)

3)一對一主鍵關聯映射(不重要)

 

Hibernate Annotation幾種關聯映射:一對一(One-To-One) 使用@OneToOne註解建立實體Bean之間的一對一關聯。一對一關聯有三種情況:

(1).關聯的實體都共享同樣的主鍵,

(2).其中一個實體通過外鍵關聯到另一個實體的主鍵(注意要模擬一對一關聯必須在外鍵列上添加唯一約束),

(3).通過關聯表來保存兩個實體之間的連接關係(要模擬一對一關聯必須在每一個外鍵上添加唯一約束)。

 

 8.2、什麼時候採用共享主鍵,什麼時候採用唯一外鍵?

 

Hibernate有兩種映射實體一對一關聯關係的實現方式:共享主鍵方式和唯一外鍵方式。共享主鍵方式:就是限制兩個數據表的主鍵使用相同的值。

唯一外鍵方式:就是一個表的外鍵和另一個表的唯一主鍵對應形成一對一映射關係。

 1、共享主鍵方式:

在註冊時,往往不但要填寫登錄賬戶和密碼,還要填寫其他的詳細信息,這兩部分信息通常會放在不同的表中。這時登錄表和詳細信息表屬於典型的一對一關係,可以按共享主鍵方式進行。

 

 在進行該關聯時要對POJO類的ORM映射文件*.hbm.xml 進行修改:

 如:

 Login 表與Login 類的ORM映射文件Login.hbm.xml 文件在<class...></class>標籤中添加:

 

 

 

而detail 表與Detail 類的ORM映射文件Detail.hbm.xml 文件中添加:

 

 

 

2、唯一外鍵方式:多對一的特殊情況。

 

9、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

綁定到線程)

 

10、AOP編程

 10.1、簡述面向切面編程(AOP)的好處。

 1.每個業務邏輯放在一個地方(事務管理,日誌管理,安全,其他),避免代碼分散到各個角落

 2.業務邏輯更加清晰。AOP只是一種編程範式,用於提供從另一角度來考慮程序結構以完善面向對象編程。主要優點有:

1-降低模塊之間的耦合度。

2-使系統容易擴展。

3-更好的代碼複用。解耦合,高內降低耦合。

 

   10.2、Spring中場勇敢的基礎切面有哪些?

 權限判斷、異常處理,日誌記錄,事務管理,安全,性能監測,訪問控制,

 10.3、spring切面的實現原理是什麼?

反射實現AOP動態代理模式

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章