Java部分基礎知識面試複習

Java基礎知識

一、重載(overload)與重寫(override)的區別?

  • 重載:發生在同一個類中,方法名必須相同,參數類型可以不同、個數可以不同、順序可以不同、方法返回值和訪問修飾符可以不同,發生在編譯時
  • 重寫:發生在父、子類中,方法名、參數列表必須相同,返回值範圍小於父類,拋出的異常範圍小於等於父類,訪問修飾符大於等於父類;如果父類方法訪問修飾符爲private,則子類不可重寫該方法

父類的構造器只能被重載,但不允許被重寫

二、Java面向對象編程的三大特性

  1. 封裝

    封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性或方法。如果屬性不想被外界訪問,我們可以選擇不提供給外界方法。

  2. 繼承

    • 子類用於父類對象的所有屬性和方法(包括私有屬性 和私有方法),但是父類中的私有屬性和方法,子類是無法訪問的,只是擁有

    • 子類可以擁有自己的屬性和方法,即子類可以對父類進行拓展

    • 子類可以用自己的方式實現父類的方法。

  3. 多態

    在Java中,對於多態的核心表現主要有以下兩點:

    • 方法的多態性
      1. 方法的重載:同一個方法名稱可以根據參數的類型或個數不同調用不同的方法體
      2. 方法的覆寫:同一個父類的方法,可能根據實例化子類的不同也有不同的實現
    • 對象的多態性
      1. 對象的向上轉型:父類 父類對象 = 子類實例(自動的,90%都是這種情況)
      2. 對象的向下轉型:子類 子類對象 = (子類)父類實例 (強制的,否則會拋出ClassCastException)
public class 多態 {
    public static void main(String[] args) {
        //向上轉型
        Person p = new Student();
        p.print(); //輸出:2. 我是兒子!
        

        //向下轉型
        /*Person person = new Student();
        person.print();//輸出:2. 我是兒子!
        Student student = (Student) person;
        student.only();//輸出:只有子類有!!!*/
    }
}

class Person{
    public void print(){
        System.out.println("1. 我是爸爸!");
    }
}

class Student extends Person{
    @Override
    public void print() {
        System.out.println("2. 我是兒子!");
    }

    public void only(){
        System.out.println("只有子類有!!!");
    }
}

四、接口和抽象類的區別是什麼?抽象必須要有抽象方法嗎?抽象能用final關鍵字修飾嗎?

接口和抽象類的區別是什麼?

  1. 接口的方法默認權限修飾符是public,所有的方法中不能實現具體的邏輯。(Java 8開始接口方法可以有默認實現),而抽象類可以有非抽象的方法。

  2. 接口中的實例變量默認是final類型的,而抽象類中則不一定

  3. 一個類可以實現多個接口,但最多實現一個抽象類。

  4. 一個類實現接口的話要實現接口的所有方法,而抽象類不一定

  5. 接口不能以new實例化,但可以聲明,但是必須引用一個實現該接口的對象。從設計層面,抽象是對類的抽象,是一種模板設計,而接口是對行爲的抽象,是一種行爲的規範。

備註: 早JDK8中,接口也可以定義 靜態方法,可以使用接口名調用。實現類和實現是不可以調用的。如果同時實現兩個接口,接口中定義了一樣的默認方法,則必須重寫,不然會報錯。

抽象類必須要有抽象方法嗎?

答:抽象類中不一定包含抽象方法,但是包含抽象方法的類一定要被聲明爲抽象類。

抽象類能使用final關鍵字修飾嗎?

答:抽象類不能使用final來修飾。當用final修飾一個類時,表明此類不能被繼承。final修飾的類中所有成員方法都會被隱式地指定爲final方法,這明顯的違背了抽象類存在的意義。

五、 Java中值傳遞和引用傳遞?

答:Java中實際上只有值傳遞,並沒有引用傳遞。

  • 參數傳遞時,是拷貝實參的副本,然後傳遞給形參。(值傳遞)
  • 在函數中,只有修改了實參所指向的對象內容,纔會影響到實參。
    注意:傳遞參數是引用類型,或者說是對象時,並不代表它就是引用傳遞。引用傳遞不是用來形容參數的類型的,不要被“引用”這個詞本身迷惑了。

六、修飾符protected和default

答:

  • protected 包內所有類可見,包外有繼承關係的子類可見(protected修飾的方法可以在子類內部調用卻不能在子類外部調用)
  • default表示默認,不僅本類訪問,而且是同包可見。(被default修飾的方法是接口的默認方法。既只要實現該接口的類,都具有這麼一個默認方法,默認方法也可以被重寫)

七、Java中Exception和Error

答:Exception和Error均繼承自 Throwable 類。
Exception 分爲 受查異常 和 非受查異常。
非受查異常即繼承自RuntimeException類的異常,運行時捕獲,常見的有:

  • NullPointerException
  • IllegalArgumentException
  • ClassCastException
  • IndexOutOfBoundException
  • NumberFormatException

受查異常即非RuntimeException,在編譯時被捕獲,常見的有:

  • IOException
  • ClassNotFoundException

常見的Error有:

  • StackOverFlowError
  • NoClassDefFoundError
  • OutOfMemoryError

八、Java “==” 和 equals() 的區別

答:== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。(基本數據類型中 ‘==’ 比較的是其值是否相等,而引用類型比較的是內存地址值是否相等)

而equals()方法的作用也是比較兩個對象是否相等,但它的具體使用有如下兩種場景:

  • 對於未重寫equals()方法的類,調用equals()方法時,相當於使用“==”比較;
  • 重寫equals()方法的類,比較的是對象的成員變量值是否相同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章