1. 程式人生 > 其它 >Java面試題(十)

Java面試題(十)

1. Java反射技術主要實現類有哪些,作用分別是什麼?

在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中
1)Class類:代表一個
2)Field 類:代表類的成員變數(屬性)
3)Method類:代表類的成員方法
4)Constructor 類:代表類的構造方法
5)Array類:提供了動態建立陣列,以及訪問陣列的元素的靜態方法

2. Class類的作用?生成Class物件的方法有哪些?

Class類是Java 反射機制的起源和入口,用於獲取與類相關的各種資訊,提供了獲取類資訊的相關方法。Class類繼承自Object類 

Class類是所有類的共同的圖紙。每個類有自己的物件,好比圖紙和實物的關係;每個類也可看做是一個物件,有共
同的圖紙Class,存放類的 結構資訊,能夠通過相應方法取出相應資訊:類的名字、屬性、方法、構造方法、父類和
介面

方法 例項
物件名.getClass()

String str="bdqn";

Class class = str.getClass();

物件名.getSuperClass()

Student stu=new Student();

Class c1=stu.getClass();

Class c2=stu.getSuperClass();

Class.forName()

Class clazz=Class.forName("java.lang.Object");

Class.forName("oracle.jdbc.driver.OracleDriver");

類名.class

Class c1=String.class;

Class c2=Student.class;

Class c2=int.class

包裝類.TYPE

Class c1=Integer.TYPE;

3.反射的使用場合和作用、及其優缺點

1)使用場合:
在編譯時根本無法知道該物件或類可能屬於哪些類,程式只依靠執行時資訊來發現該物件和類的真實資訊。
2)主要作用:
通過反射可以使程式程式碼訪問裝載到JVM 中的類的內部資訊,獲取已裝載類的屬性資訊,獲取已裝載類的方法,獲取
已裝載類的構造方法資訊
3)反射的優點
反射提高了Java程式的靈活性和擴充套件性,降低耦合性,提高自適應能力。它允許程式建立和控制任何類的物件,無需
提前硬編碼目標類;反射是其它一些常用語言,如C、C++、Fortran 或者Pascal等都不具備的
4) Java反射技術應用領域很廣,如軟體測試等;許多流行的開源框架例如Struts、Hibernate、Spring在實現過程中
都採用了該技術
5)反射的缺點 

效能問題:使用反射基本上是一種解釋操作,用於欄位和方法接入時要遠慢於直接程式碼。因此Java反射機制主要應用
在對靈活性和擴充套件性要求很高的系統框架上,普通程式不建議使用。
使用反射會模糊程式內部邏輯:程式人員希望在原始碼中看到程式的邏輯,反射等繞過了原始碼的技術,因而會帶來
維護問題。反射程式碼比相應的直接程式碼更復雜。

4.面向物件設計原則有哪些

面向物件設計原則是面向物件設計的基石,面向物件設計質量的依據和保障,設計模式是面向物件設計原則的經典應用
1)單一職責原則SRP
2)開閉原則OCP
3)里氏替代原則LSP
4)依賴注入原則DIP
5)介面分離原則ISP
6)迪米特原則LOD
7)組合/聚合複用原則CARP
8)開閉原則具有理想主義的色彩,它是面向物件設計的終極目標。其他設計原則都可以看作是開閉原則的實現手段或方法

5. char型變數中能不能儲存一箇中文漢字?

1.java採用unicode編碼,2個位元組(16位)來表示一個字元, 無論是漢字還是數字,字母,或其他語言都可以存
儲。
2.char 在java中是2個位元組,所以可以儲存中文

6.String和StringBuilder、StringBuffer的區別?

String:String 的值被建立後不能修改,任何對 String 的修改都會引發新的 String 物件的生成

StringBuffer:跟 String 類似,但是值可以被修改,使用 synchronized 來保證執行緒安全

StringBuilder:StringBuffer 的非執行緒安全版本,沒有使用 synchronized,具有更高的效能,推薦優先使用。

7.String s = new String("xyz") 建立了幾個字串物件?

一個或兩個。如果字符串常量池已經有“xyz”,則是一個;否則,兩個。

字元創常量池沒有 “xyz”,此時會建立如下兩個物件

一個是字串字面量 "xyz" 所對應的、駐留(intern)在一個全域性共享的字串常量池中的例項,此時該例項也是在堆中,字串常量池只放引用。

另一個是通過 new String() 建立並初始化的,內容與"xyz"相同的例項,也是在堆中。

8.String s = "xyz" 和 String s = new String("xyz") 區別?

兩個語句都會先去字串常量池中檢查是否已經存在 “xyz”,如果有則直接使用,如果沒有則會在常量池中建立 “xyz” 物件。

另外,String s = new String("xyz") 還會通過 new String() 在堆裡建立一個內容與 "xyz" 相同的物件例項。

所以前者其實理解為被後者的所包含。

9.什麼是反射

反射是指在執行狀態中,對於任意一個類都能夠知道這個類所有的屬性和方法;並且對於任意一個物件,都能夠呼叫它的任意一個方法;這種動態獲取資訊以及動態呼叫物件方法的功能稱為反射機制。

10.深拷貝和淺拷貝區別是什麼?

資料分為基本資料型別引用資料型別
基本資料型別:資料直接儲存在中;
引用資料型別:儲存在中的是物件的引用地址,真實的物件資料存放在堆記憶體裡。

淺拷貝:對於基礎資料型別:直接複製資料值;對於引用資料型別:只是複製了物件的引用地址,新舊物件指向同一個記憶體地址,修改其中一個物件的值,另一個物件的值隨之改變。

深拷貝:對於基礎資料型別:直接複製資料值;對於引用資料型別:開闢新的記憶體空間,在新的記憶體空間裡複製一個一模一樣的物件,新老物件不共享記憶體,修改其中一個物件的值,不會影響另一個物件。

深拷貝相比於淺拷貝速度較慢並且花銷較大。


學習程式設計師囧輝的java面試文章,若存在侵權,請聯絡,謝謝!