###
1.類與物件有哪些區別?類是一個抽象的概念,是對某一事物的描述;而物件是類的例項,是實實在在存在的個體。
注意:物件中又有類物件,即Class物件,但是類物件始終還是物件,不是類,這兩個概念別搞混淆了。
2.Java 中可以多繼承嗎?Java 中只能單繼承,但可以實現多介面,並且支援多層繼承。
3.Java 中為什麼不能實現多繼承?答:從技術的實現角度來說,是為了降低程式設計的複雜性。假設 A 類中有一個 m() 方法,B 類中也有一個 m() 方法,如果 C 類同時繼承 A 類和 B 類,那呼叫 C 類的 m() 方法時就會產生歧義,這無疑增加了程式開發的複雜性,為了避免這種問題的產生,Java 語言規定不能多繼承類,但可以實現多介面。
4.覆蓋和過載有哪些區別?重寫(Override)從字面上看,重寫就是 重新寫一遍的意思。其實就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類原有的方法,但有時子類並不想原封不動地繼承父類中的某個方法,所以在方法名,引數列表,返回型別(除過子類中方法的返回值是父類中方法返回值的子類時)都相同的情況下, 對方法體進行修改或重寫,這就是重寫。但要注意子類函式的訪問修飾許可權不能少於父類的。public class Father { public static void main(String[] args) { // TODO Auto-generated method stub Son s = new Son(); s.sayHello(); } public void sayHello() { System.out.println("Hello"); }}class Son extends Father{ @Override public void sayHello() { // TODO Auto-generated method stub System.out.println("hello by "); }}
重寫 總結:
1.發生在父類與子類之間
2.方法名,引數列表,返回型別(除過子類中方法的返回型別是父類中返回型別的子類)必須相同
3.訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
4.重寫方法一定不能丟擲新的檢查異常或者比被重寫方法的更加寬泛的檢查型異常
過載(Overload)在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同甚至是引數順序不同)則視為過載。同時,過載對返回型別沒有要求,可以相同也可以不同,但不能透過返回型別是否相同來判斷過載。public class Father { public static void main(String[] args) { // TODO Auto-generated method stub Father s = new Father(); s.sayHello(); s.sayHello("wintershii"); } public void sayHello() { System.out.println("Hello"); } public void sayHello(String name) { System.out.println("Hello" + " " + name); }}
過載 總結:1.過載Overload是一個類中多型性的一種表現 2.過載要求同名方法的引數列表不同(引數型別,引數個數甚至是引數順序) 3.過載的時候,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。
5.為什麼方法不能根據返回型別來區分過載?答:因為在方法呼叫時,如果不指定型別資訊,編譯器就不知道你要呼叫哪個方法了。比如,以下程式碼:
float max(int x,int y);int max(int x,int y);// 方法呼叫max(1,2);
因為 max(1,2) 沒有指定返回值,編譯器就不知道要呼叫哪個方法了。
6.說說構造方法的特點有哪些?答:構造方法的特徵如下:
構造方法必須與類名相同;構造方法沒有返回型別(預設返回本類型別);構造方法不能被繼承、覆蓋、直接呼叫;類定義時提供了預設的無參構造方法;構造方法可以私有,外部無法使用私有構造方法建立物件。建構函式能不能被覆蓋?能不能被過載?
建構函式可以過載,但不能覆蓋。
7.以下程式執行的結果是?class ExecTest { public static void main(String[] args) { Son son = new Son(); }}class Parent{ { System.out.print("1"); } static{ System.out.print("2"); } public Parent(){ System.out.print("3"); }}class Son extends Parent{ { System.out.print("4"); } static{ System.out.print("5"); } public Son(){ System.out.print("6"); }}
結果是:251346
8.類載入順序整體
細分
以下程式執行的結果是?
class A { public int x = 0; public static int y = 0; public void m() { System.out.print("A"); }}class B extends A { public int x = 1; public static int y = 2; public void m() { System.out.print("B"); } public static void main(String[] args) { A myClass = new B(); System.out.print(myClass.x); System.out.print(myClass.y); myClass.m(); }}
結果是:00B
注意:在 Java 語言中,變數不能被重寫。
9.Java 中的 this 和 super 有哪些區別?this 和 super 都是 Java 中的關鍵字,起指代作用,在構造方法中必須出現在第一行,它們的區別如下。
基礎概念:this 是訪問本類例項屬性或方法;super 是子類訪問父類中的屬性或方法。查詢範圍:this 先查本類,沒有的話再查父類;super 直接訪問父類。使用:this 單獨使用時,表示當前物件;super 在子類覆蓋父類方法時,訪問父類同名方法。10.在靜態方法中可以使用 this 或 super 嗎?為什麼?在靜態方法中不能使用 this 或 super,因為 this 和 super 指代的都是需要被創建出來的物件,而靜態方法在類載入的時候就已經建立了,所以沒辦法在靜態方法中使用 this 或 super。
11.靜態方法的使用需要注意哪些問題?靜態方法的使用需要注意以下兩個問題:
靜態方法中不能使用例項成員變數和例項方法;靜態方法中不能使用 this 和 super。12.final 修飾符的作用有哪些?final也是很多面試喜歡問的地方,但我覺得這個問題很無聊,通常能回答下以下5點就不錯了:
被final修飾的類不可以被繼承被final修飾的方法不可以被重寫被final修飾的變數不可以被改變.如果修飾引用,那麼表示引用不可變,引用指向的內容可變.被final修飾的方法,JVM會嘗試將其內聯,以提高執行效率被final修飾的常量,在編譯階段會存入常量池中.除此之外,編譯器對final域要遵守的兩個重排序規則更好:
在建構函式內對一個final域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序 初次讀一個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序.
經典使用場景:Integer,String等類中有使用到。
13.覆蓋 equals() 方法的時候需要遵守哪些規則?Oracle 官方的文件對於 equals() 重寫制定的規則如下。
自反性:對於任意非空的引用值 x,x.equals(x) 返回值為真。對稱性:對於任意非空的引用值 x 和 y,x.equals(y) 必須和 y.equals(x) 返回相同的結果。傳遞性:對於任意的非空引用值 x、y 和 z,如果 x.equals(y) 返回值為真,y.equals(z) 返回值也為真,那麼 x.equals(z) 也必須返回值為真。一致性:對於任意非空的引用值 x 和 y,無論呼叫 x.equals(y) 多少次,都要返回相同的結果。在比較的過程中,物件中的資料不能被修改。對於任意的非空引用值 x,x.equals(null) 必須返回家。此題目不要求記憶,能知道大概即可,屬於加分項題目。
14.在 Object 中 notify() 和 notifyAll() 方法有什麼區別?notify() 方法隨機喚醒一個等待的執行緒,而 notifyAll() 方法將喚醒所有在等待的執行緒。
如何使用 clone() 方法?如果是同一個類中使用的話,只需要實現 Cloneable 介面,定義或者處理 CloneNotSupportedException 異常即可,請參考以下程式碼:
public class CloneTest implements Cloneable { int num; public static void main(String[] args) throws CloneNotSupportedException { CloneTest ct = new CloneTest(); ct.num = 666; System.out.println(ct.num); CloneTest ct2 = (CloneTest) ct.clone(); System.out.println(ct2.num); }}
如果非內部類呼叫 clone() 的話,需要重寫 clone() 方法,請參考以下程式碼:
class CloneTest implements Cloneable { int num; public static void main(String[] args) throws CloneNotSupportedException { CloneTest ct = new CloneTest(); ct.num = 666; System.out.println(ct.num); CloneTest ct2 = (CloneTest) ct.clone(); System.out.println(ct2.num); } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }}public class CloneTest2 { public static void main(String[] args) throws CloneNotSupportedException { CloneTest ct = new CloneTest(); ct.num = 666; System.out.println(ct.num); CloneTest ct2 = (CloneTest) ct.clone(); System.out.println(ct2.num); }}
物件克隆是原型模式的經典實現。
15.java中物件的建立方式有哪幾種?java中提供了以下四種建立物件的方式:
new建立新物件透過反射機制採用clone機制透過序列化機制