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

Java面試題(四)

1.static關鍵字的作用

static可以修飾變數、方法、程式碼塊和內部類

static屬性屬於這個類所有

可以物件建立後通過物件名.屬性名類名.屬性名兩種方式來訪問

1.1在記憶體中份數不同

不管有多少個物件,static變數只有1

static變數是屬於整個類的,也稱為類變數

而非靜態變數是屬於物件的,也稱為例項變數

1.2在記憶體中存放的位置不同

靜態變數存在方法區中, 例項變數存在堆記憶體

1.3訪問的方式不同

例項變數 : 物件名.變數名 student1.name="Jacob"

靜態變數

物件名.變數名 student1.schoolName="希望小學";【不推薦】

類名.變數名 Student.schoolName="希望小學";【推薦】

1.4在記憶體中分配空間的時間不同

例項變數:建立物件的時候才分配了空間。

靜態變數:第一次使用類的時候
Student.schoolName="希望小學";或者Student stu1 = new Student("小明","男",20,98);
static方法也可以通過物件名.方法名類名.方法名兩種方式來訪問
static程式碼塊。當類被第一次使用時(可能是呼叫static屬性和方法,或者建立其物件)執行靜態程式碼塊,且只被執行
一次,主要作用是實現static屬性的初始化。
static內部類:屬於整個外部類,而不是屬於外部類的每個物件。不能訪問外部類的非靜態成員(變數或者方法),
可以訪問外部類的靜態成員 

2. final和abstract關鍵字的作用

final和abstract是功能相反的兩個關鍵字,可以對比記

abstract:可以用來修飾類和方法,不能用來修飾屬性和構造方法;使用abstract修飾的類是抽象類,需要被繼承,使
用abstract修飾的方法是抽象方法,需要子類被重寫。 

final:可以用來修飾類、方法和屬性,不能修飾構造方法。使用final修飾的類不能被繼承,使用final修飾的方法不能被
重寫,使用final修飾的變數的值不能被修改,所以就成了常量

3.final、finally、finalize的區別

final:修飾符(關鍵字)如果一個類被宣告為final,意味著它不能再派生出新的子類,不能作為父類被繼承

例如:String
類、Math類等。將變數或方法宣告為final,可以保證它們在使用中不被改變。被宣告為final的變數必須在宣告時給
定初值,而在以後的引用中只能讀取,不可修改。被宣告為final的方法也同樣只能使用,不能重寫,但是能夠過載
使用final修飾的物件,物件的引用地址不能變,但是物件的值可以變!
finally:異常處理時提供 finally 塊來執行任何清除操作。如果有finally的話,則不管是否發生異常,finally語句都會
被執行。一般情況下,都把關閉物理連線(IO流、資料庫連線、Socket連線)等相關操作,放入到此程式碼塊中.。
finalize方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要清理工作
finalize() 方法是在垃圾收集器刪除物件之前被呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類
覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。 一般情況下,此方法由JVM呼叫,程式設計師不要去呼叫! 

4. 寫出java.lang.Object類的常用方法

(1)public boolean equals(java.lang.Object)比較物件的地址值是否相等,如果子類重寫,則比較物件的內容是否相
等;
(2)public native int hashCode() 獲取雜湊碼
(3)public java.lang.String toString() 把資料轉變成字串
(4)public final native java.lang.Class getClass() 獲取類結構資訊
(5)protected void finalize() throws java.lang.Throwable垃圾回收前執行的方法
(6)protected native Object clone() throws java.lang.CloneNotSupportedException 克隆
(7)public final void wait() throws java.lang.InterruptedException多執行緒中等待功能
(8)public final native void notify() 多執行緒中喚醒功能
(9)public final native void notifyAll() 多執行緒中喚醒所有等待執行緒的功能

5.許可權修飾符的區別

Java中有四種訪問許可權控制,大小情況:public》protected》default》private

  同一個類 同一個包 子類 所有類
private      
default    
protected  
public

 6.繼承條件下構造方法的執行過程

情況1:如果子類的構造方法中沒有通過super顯式呼叫父類的有參構造方法,也沒有通過this顯式呼叫自身的其他構
造方法,則系統會預設先呼叫父類的無參構造方法。在這種情況下,寫不寫“super();”語句,效果是一樣的。

情況2:如果子類的構造方法中通過super顯式呼叫父類的有參構造方法,那將執行父類相應構造方法,而不執行父
類無參構造方法。

7.==和equals的區別和聯絡

“==”是關係運算符,equals()是方法,同時他們的結果都返回布林值;

“==”使用情況如下:

a) 基本型別,比較的是值
b) 引用型別,比較的是地址

equals()方法使用如下: 

a) 系統類一般已經覆蓋了equals(),比較的是內容。

8.談談Java的多型

多型性是OOP中的一個重要特性

實現多型的三個條件(前提條件,向上轉型、向下轉型)

1、繼承的存在;(繼承是多型的基礎,沒有繼承就沒有多型)

2、子類重寫父類的方法。(多型下會呼叫子類重寫後的方法)

3、父類引用變數指向子類物件。(涉及子類到父類的型別轉換)

向上轉型 Animal a = new Cat();

將一個父類的引用指向一個子類物件,稱為向上轉型,自動進行型別轉換。此時通過父類引用變數呼叫的方法是子類 覆蓋或繼承父類的方法,而不是父類的方法,此時通過父類引用變數無法呼叫子類特有的方法.

向下轉型 Cat a2 = (Cat)a;

將一個指向子類物件的引用賦給一個子類的引用,成為向下轉型,此時必須進行強制型別轉換。向下轉型必須轉換為 父類引用指向的真實子類型別,否則將出現ClassCastException,不是任意的強制轉換.

9.簡述Java的垃圾回收機制

傳統的C/C++語言,需要程式設計師負責回收已經分配記憶體

顯式回收垃圾回收的缺點

1)程式忘記及時回收,從而導致記憶體洩露,降低系統性能。
2)程式錯誤回收程式核心類庫的記憶體,導致系統崩潰。

Java語言不需要程式設計師直接控制記憶體回收,是由JRE在後臺自動回收不再使用的記憶體,稱為垃圾回收機制簡稱GC

1)可以提高程式設計效率。
2)保護程式的完整性。
3)其開銷影響效能。Java虛擬機器必須跟蹤程式中有用的物件,確定哪些是無用的。 

垃圾回收機制的特點: 

1)垃圾回收機制回收JVM堆記憶體裡的物件空間,不負責回收棧記憶體資料。
2)對其他物理連線,比如資料庫連線、輸入流輸出流、Socket連線無能為力。
3)垃圾回收發生具有不可預知性,程式無法精確控制垃圾回收機制執行。
4)可以將物件的引用變數設定為null,暗示垃圾回收機制可以回收該物件。 

 垃圾回收機制回收任何物件之前,總會先呼叫它的finalize方法

程式設計師可以通過System.gc()

10.基本資料型別和包裝類

1) 八個基本資料型別的包裝類

基本資料型別  包裝類
byte Byte
boolean Boolean
short  Short
char Character
int  Integer
long Long
float Float
double Double

2) 為什麼為基本型別引入包裝類

基本資料型別有方便之處,簡單、高效。

3) 包裝類和基本資料型別之間的轉換

包裝類------ wrapperInstance.xxxValue() ------>基本資料型別

包裝類<---new WrapperClass(primitive)-- new WrapperClass(string)------基本資料型別

4)自動裝箱和自動拆箱

JDK1.5提供了自動裝箱(autoboxing)和自動拆箱(autounboxing)功能, 從而實現了包裝類和基本資料型別之間
的自動轉換

5)包裝類還可以實現基本型別變數和字串之間的轉換

基本型別變數------------String.valueof()------------>字串
基本型別變數<------------WrapperClass.parseXxx(string)------------字串

 


若存在侵權,請聯絡,謝謝