目錄
重載與重寫的概念
重載與重寫的區別
重載與重寫的總結
構造器是否能被重寫override
為什么函數不能根據返回類型來區分重載
重載與重寫的概念
重載:同樣一個方法可以根據輸入參數列表的不同,做出不同的處理。普通方法和構造器方法都能夠重載。
方法重載:
/**
* 重載方法
*/
public class Print {
public void print(String str) {
System.out.println(str);
}
public void print(Integer i) {
System.out.println(i);
}
public void print(Float f) {
System.out.println(f);
}
public void print(Boolean b) {
System.out.println(b);
}
}
構造器重載
/**
* 重載構造器
*/
public class Print {
Print(String str){
System.out.println(str);
}
Print(Integer i){
System.out.println(i);
}
Print(Float f){
System.out.println(f);
}
public void print(Boolean b) {
System.out.println(b);
}
}
重寫:重寫是要在子類繼承父類的同名方法時,當輸入參數列表一樣時,要做出不同于父類的邏輯功能,就是覆蓋重寫父類方法。注意:重寫的方法上有一個@Override,表示該方法被重寫了。
/**
* 方法重寫
*/
class Father {
public void print(){
System.out.println("Father");
}
public void print(String str){
System.out.println("Father -> "+str);
}
}
class Son extends Father {
// 重寫print()方法
@Override
public void print() {
System.out.println("Son");
}
// 重寫print(String str)方法
@Override
public void print(String str) {
System.out.println("Son -> "+str);
}
}
重載與重寫的區別
重載的注意事項:發生在同一個類中,方法名必須相同。
方法重載與下列因素相關:
1. 參數個數不同
2. 參數類型不同
3. 參數的多類型順序不同
方法重載與下列因素無關:
1. 與參數的名稱無關
2. 與方法的返回值類型無關
下面是錯誤示例:
上面這句話嚴格來說是錯誤的,因為參數個數相同,但可以是類型不同
下面是參數個數相同,參數類型相同,但是順序不同。
參數名稱即使不同,但參數類型、參數列表、參數個數相同,也會報錯
即使返回類型不同,但方法名相同,參數類型、參數列表、參數個數相同,也會報錯
重寫注意事項:發生在運行期,是兩個及以上的類,是子類對父類允許訪問的方法進行重新編寫。方法名、參數列表、參數順序必須相同,子類方法返回值類型比父類方法返回值類型更小或相等。
拋出異常范圍小于等于父類,訪問修飾符范圍大于等于父類。
如果父類方法訪問修飾符為private/final/static,則子類不能重寫該方法,但是被static修飾的方法能夠被再次聲明。
構造方法無法被重寫
重寫的方法上有一個@Override表示該方法被重寫了。
下面是關于重寫特點的代碼解釋。
1、拋出異常范圍小于等于父類
子類拋出異常范圍等于父類拋出異常范圍,不會報錯。
子類拋出異常范圍小于父類拋出異常范圍,不會報錯。
子類拋出異常范圍大于父類拋出異常范圍,會報錯。
2、訪問修飾符范圍大于等于父類
訪問修飾符的范圍:public > protected > private
子類訪問修飾符的范圍大于父類訪問修飾符的范圍,不會報錯
子類訪問修飾符的范圍等于父類訪問修飾符的范圍,不會報錯
子類訪問修飾符的范圍小于父類訪問修飾符的范圍,會報錯
3、如果父類方法訪問修飾符為private/final/static,則子類不能重寫該方法,但是被static修飾的方法能夠被再次聲明。
使用private修飾的無法重寫
使用final修飾的無法重寫
使用static修飾的不能重寫,但能被再次聲明
下面的代碼也不能稱之為重寫:當向上轉型時,調用的還是父類的方法。
class Father {
static void print() {
System.out.println("Father");
}
}
class Son extends Father {
static void print() {
System.out.println("Son");
}
}
public class Demo {
public static void main(String[] args) {
Son.print();
Father son=new Son();
son.print();
}
}
/*
* 打印結果:
* Son
* Father
*/
在Java中,如果父類含有一個靜態方法,且在子類中也含有一個返回類型,方法名、參數列表等都與之相同的的靜態方法,在子類中只是對父類的該同名方法進行隱藏,并不是重寫。父類與子類含有的其實是兩個沒有關系的方法,兩者的行為不具有多態性。
在上面的例子中,print方法與類發生了關聯,但它不在乎什么類型的類正在創建它,而僅在乎引用的類型。在Father son = new Son()中,son是類Son在內存中的一個Father類型的引用,如果一個static修飾的方法被調用了,JVM不會檢查什么類型正在指向它,只會調用與Father類相關聯的方法的實例。
4、?類?法返回值類型應??類?法返回值類型更?或相等
如果?法的返回類型是void和基本數據類型,則返回值重寫時不可修改。但是如果?法的返回值是引?類型,重寫時是可以返回該引?類型的?類的。
class Father {
public String print() {
return "Father";
}
}
class Son extends Father {
@Override
public String print() {
return "Son";
}
public Father father(){
return new Father();
}
}
class SonSon extends Son {
@Override
public String print() {
return "SonSon";
}
@Override
public Father father() {
return new Son();
}
}
重載與重寫的總結
重載重寫概念發生在一個類中。一個方法根據輸入參數列表的不同,做出不同的邏輯處理。普通方法和構造器都能夠重載發生在子類和父類中。子類方法繼承父類的同名方法,重新寫方法的處理邏輯。普通方法能夠重寫,構造器不能夠重寫。
特征普通方法重載方法名相同;構造器重載與類名相同。重寫的方法上有一個@Override注解,表示該方法被重寫了。
相關因素方法重載與參數個數、參數類型、多類型參數的順序的不同相關。(即方法的參數列表要不一樣)方法重寫與參數個數、參數類型、多類型參數的順序的相同相關。(即方法的參數列表要一樣)
不相關因素方法重載與參數的名稱、方法的返回值類型無關。(即重載方法的參數名稱、返回值類型是否一樣不重要)方法重寫的參數名稱可以改變,但返回值類型要小于等于父類方法的返回值類型。
其他可以拋出不同的異常,可以有不同修飾符。子類拋出的異常范圍要小于等于父類,訪問修飾符的范圍要大與等于父類。如果父類方法被private/final/static修飾,那么子類不能重寫該方法。
構造器是否能被重寫override
構造器Constructor 不能被 override(重寫),但是可以 overload(重載),所以你可以看到?個類中有多個構造函數的情況。
構造器可以重載
為什么函數不能根據返回類型來區分重載
為什么不能根據返回類型來區分重載?因為調用時不能指定類型信息,編譯器不知道你要調用哪個函數。
當執行add(1, 2)這個方法時,不需要保存返回值,那么該調用哪個方法呢?這很好不區分吧。
如果需要返回值,比如說float sum = add(1, 2);還好區分些,至少可以根據前面的float推斷出要調用哪個方法。但如果不需要返回值,那么幾乎難以區分。
如果方法的返回值不加以利用,那么返回值將毫無用處,自然無法作為區別的標準。
更多的適合方法的返回值是函數運行后的一個結果,是方法的調用者和被調用者通信的關鍵,并不能作為某個方法的唯一標識。