1. 程式人生 > >java面試題(持續更新中)

java面試題(持續更新中)

1、寫出內部類的特點

Java中的內部類共分為四種:

靜態內部類:只可以訪問外部類的靜態成員和靜態方法,包括了私有的靜態成員和方法生成靜態內部類物件的方式為:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
  成員內部類:它可以訪問它的外部類的所有成員變數和方法,不管是靜態的還是非靜態的都可以。
在外部類裡面建立成員內部類的例項:this.new Innerclass();
在外部類之外建立內部類的例項:(new Outerclass()).new Innerclass();
在內部類裡訪問外部類的成員:Outerclass.this.member
  區域性內部類

:像區域性變數一樣,不能被public, protected, private和static修飾。只能訪問方法中定義的final型別的區域性變數。
區域性內部類在方法中定義,所以只能在方法中使用,即只能在方法當中生成區域性內部類的例項並且呼叫其方法。
  匿名內部類:匿名內部類就是沒有名字的區域性內部類,不使用關鍵字class, extends, implements, 沒有構造方法。
生成的.class檔案中,匿名類會生成OuterClass$1.class檔案,數字根據是第幾個匿名類而類推。

2、寫出&和&&的區別,並計算出3&4的結果。

&和&&都可以做邏輯運算,運算的兩邊都必須為真才返回真,不同的是&&運算左邊時如果為false則後面就不判斷了,而&運算會把表示式運算完。
&也叫位與,是按二進位制進行與計算,它的計算規則是:
&&也叫邏輯與,是按邏輯計算,它的計算規則是一假必假。
3&4是按位運算,3的二進位制表示為011,4的二進位制為100,所以結果為0;如果是3&&4的話則是按邏輯運算,3,4都不為0所以結果為真,即為1.

3、break、continue、他們的作用分別是什麼?

break是跳出的意思,應用於多重迴圈中跳出當前迴圈。
continue是繼續的意思,應用於邏輯結構中繼續。

4、什麼是強制型別轉換?int i=0;double s=1;int res = i+s;有沒有錯?

從高精度資料型別轉成低精度資料型別的形式叫強制型別轉換。
有錯,s是double型別,而i是int型別,res也是int型別,所以需要強制轉換。

5、final、finally、finalize的區別是什麼?

final是修飾符,用於修飾變數,方法,被他修飾的變數不可以改變值,被他修飾的方法不能被繼承
finlly是捕捉異常語句的一部分,代表無論會不會報異常,都會執行finally語句塊裡面的程式碼。
finalize是java中的序列化關鍵字。

6、使用final關鍵字修飾的變數是引用不能變還是引用的物件不能變?如何 改變final修飾的變數的值?

引用不能變,引用物件的內容可以變。
① 當final修飾的成員變數在定義的時候就初始化了值,那麼java反射機制

就已經不能動態修改它的值了。
② 當final修飾的成員變數在定義的時候並沒有初始化值的話,那麼就還能

通過java反射機制來動態修改它的值

7、==和equals方法的區別

操作符專門用來比較兩個變數的值是否相等,也就是比較變數所對應的內

存中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是

否相等,只能用==操作符。
equals 方法是用於比較兩個獨立物件的內容是否相同,就好比去比較兩個人

的長相是否相同,它比較的兩個物件是獨立的。

8、靜態變數和例項變數的區別

在語法上的區別:
靜態變數就是在前面加static的關鍵字,而例項變數則不加。
在程式執行時的區別:
例項變數屬於某個物件的屬性,必須建立例項物件,其中的例項變

量才會被分配空間,才能使用這個例項變數。
靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,

只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配

空間,靜態變數就可以被使用了。
總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態

變數則可以直接使用類名來引用。

9、為什麼不可以從static方法內部發出對非static方法的呼叫?

因為非static方法要與物件關連在一起,必須建立一個物件後,才可以在該

物件上進行方法呼叫,而static方法不需要建立物件,可以直接呼叫。

10、基本資料型別以及他們的封裝類有哪些區別,為什麼有了基本資料型別還 要有對應的封裝類?

基本型別與封裝類的最大區別是,封裝類是引用型別,就是基本型別和引用

型別的區別。
基本型別在記憶體中是儲存在棧中,引用型別的引用儲存在棧中,而值是儲存

在堆中。

因為封裝的資料型別就是一個物件,可以擁有屬性和方法,有了這些屬性和

方法我們就可以用它們來處理資料

11、請談談你對override和Overload的理解

Overload是過載的意思,Override是覆蓋的意思,也就是重寫。

過載的特性,方法名相同,傳入方法的引數列表不同(包括個數和型別).
重寫的特性,方法名相同,引數均相同,必須發生在子類.

過載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同(即引數個數或型別不同)。

重寫Override表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向物件程式設計的多型性的一種表現。子類覆蓋父類的方法時,只能比父類丟擲更少的異常,或者是丟擲父類丟擲的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問許可權只能比父類的更大,不能更小。如果父類的方法是private型別,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

12、如何實現多型?

過載和重寫
再說說過載和重寫(我在上面的題目裡已經說過了)

13、請談談介面(interface)和抽象類(abstract)的區別

抽象:含有abstract修飾符的class即為抽象類。
	抽象類的特點:		
		1、abstract 類不能建立的例項物件。
		2、含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。	

		3、abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。
		4、如果子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract型別。
		
介面:介面(interface)可以說成是抽象類的一種特例。
	介面的特點:
		1、介面中的所有方法都必須是抽象的。
		2、介面中的方法定義預設為public abstract型別
		3、介面中的成員變數型別預設為public static final。

下面比較一下兩者的語法區別:

  1. .抽象類可以有構造方法,介面中不能有構造方法。

  2. 抽象類中可以有普通成員變數,介面中沒有普通成員變數

  3. 抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。

  4. 抽象類中的抽象方法的訪問型別可以是public,protected和(預設型別,雖然
    eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別的,並且預設即為public abstract型別。

  5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法

  6. 抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問型別可以任意,但介面中定義的變數只能是public static final型別,並且預設即為public static final型別。

  7. 一個類可以實現多個介面,但只能繼承一個抽象類。

14、請描述克隆方法的特點

clone 有預設行為,super.clone();因為首先要把父類中的成員複製到位,然後才是複製自己的成員。

15、請談談對面向物件的特徵的理解

面向物件的程式語言有封裝、繼承 、抽象、多型等4個主要的特徵。
再說說封裝、繼承 、抽象、多型分別是什麼?

答案的段落分明,層次分明,條理清楚都非常重要,從這些表面的東西也可以看出一個人的習慣、辦事風格、條理

16、StringBuffer和StringBuilder的區別?

答:StringBuffer是執行緒安全的(synchronized),而 StringBuilder不是,所以StringBuilder效率更高,鎖的獲取和釋放會帶來開銷

17、length和length()的區別?

答:length是屬性,一般集合類物件擁有的屬性,取得集合的大小,陣列長度。
length()是方法,一般字串類物件有該方法,也是取得字串長度。

java中的length屬性是針對陣列說的,比如說你聲明瞭一個數組,想知道這個陣列的長度則用到了length這個屬性。
java中的length()方法是針對字串String說的,如果想看這個字串的長度則用到length()這個方法。

18、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?

code會被執行。

在return的中間,為什麼呢?主函式呼叫子函式並得到結果的過程,好比主函式準備一個空罐子,當子函式要返回結果時,先把結果放在罐子裡,然後再將程式邏輯返回到主函式。所謂返回,就是子函式說,我不運行了,你主函式繼續執行吧,這沒什麼結果可言,結果是在說這話之前放進罐子裡的。

19、Java中的異常處理機制的原理和應用

答:當JAVA程式違反了JAVA的語義規則時,JAVA虛擬機器就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是

JAVA類庫內建的語義檢查。例如陣列下標越界,會引發IndexOutOfBoundsException;訪問null的物件時會引發NullPointerException。

另一種情況就是JAVA允許程式設計師擴充套件這種語義檢查,程式設計師可以建立自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

20、throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?

一般情況下是用try來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。

try:指定一塊預防所有“異常”的程式。

catch:緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的“異常”的型別。

throw:用來明確地丟擲一個“異常”。

throws:標明一個成員函式可能丟擲的各種“異常”。

Finally:不管發生什麼“異常”都被執行一段程式碼。

可以
throw和throws都是丟擲異常的

版權宣告
本文僅代表作者觀點。
本文系作者授權發表,未經許可,不得轉載。