Java基礎知識
一、重載(overload)與重寫(override)的區別?
- 重載:發生在同一個類中,方法名必須相同,參數類型可以不同、個數可以不同、順序可以不同、方法返回值和訪問修飾符可以不同,發生在編譯時
- 重寫:發生在父、子類中,方法名、參數列表必須相同,返回值範圍小於父類,拋出的異常範圍小於等於父類,訪問修飾符大於等於父類;如果父類方法訪問修飾符爲private,則子類不可重寫該方法
父類的構造器只能被重載,但不允許被重寫
二、Java面向對象編程的三大特性
-
封裝
封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性或方法。如果屬性不想被外界訪問,我們可以選擇不提供給外界方法。
-
繼承
-
子類用於父類對象的所有屬性和方法(包括私有屬性 和私有方法),但是父類中的私有屬性和方法,子類是無法訪問的,只是擁有。
-
子類可以擁有自己的屬性和方法,即子類可以對父類進行拓展
-
子類可以用自己的方式實現父類的方法。
-
-
多態
在Java中,對於多態的核心表現主要有以下兩點:
- 方法的多態性
- 方法的重載:同一個方法名稱可以根據參數的類型或個數不同調用不同的方法體
- 方法的覆寫:同一個父類的方法,可能根據實例化子類的不同也有不同的實現
- 對象的多態性
- 對象的向上轉型:父類 父類對象 = 子類實例(自動的,90%都是這種情況)
- 對象的向下轉型:子類 子類對象 = (子類)父類實例 (強制的,否則會拋出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關鍵字修飾嗎?
接口和抽象類的區別是什麼?
-
接口的方法默認權限修飾符是public,所有的方法中不能實現具體的邏輯。(Java 8開始接口方法可以有默認實現),而抽象類可以有非抽象的方法。
-
接口中的實例變量默認是final類型的,而抽象類中則不一定
-
一個類可以實現多個接口,但最多實現一個抽象類。
-
一個類實現接口的話要實現接口的所有方法,而抽象類不一定
-
接口不能以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()方法的類,比較的是對象的成員變量值是否相同