多載
1.構造器的多載
因為構造器的名字必須與類名相同,所以同一個類的所有構造器名肯定相同,構成多載;為了讓系統能區分不同的構造器,多個構造器的引數串列必須不同,
class Person{
int age;
String name;
public Person(){
}
public Person(int age){
this.age = age;
}
public Person(int age,String name){
this(age);
this.name = name;
}
}
2.方法的多載(overload)
1.定義:在同一個類中,允許存在一個以上的同名方法,只要他們的引數個數或者引數型別不同即可,
兩同一不同”:同一個類、相同方法名
引數串列不同:引數個數不同,引數型別不同
2.舉例:
Arrays類中多載的sort() / binarySearch()
3.判斷是否多載:
跟方法的權限修飾符、回傳值型別、形參變數名、方法體都沒有關系!
class Person{
public void getSum(int i,int j){//A
System.out.println("憨憨");
}
public void getSum(double d1,double d2){//B
}
public void getSum(String s,int i){//形參先后順序不同,也構成多載//C
}
public void getSum(int i,String s){//D
}
public void getSum(int i,int j){//與方法體無關!!!!
return 0;
}
public void getSum(int m,int n){//與引數名無關!!!!
}
private void getSum(int i,int j){//與權限修飾符大小無關!!!!
}
}
4.在通過物件呼叫方法時,如何確定某一個指定的方法 :
方法名------>引數串列
重寫
為什么要重寫:父類的功能無法滿足子類的需求
方法重寫的前提:必須要存在繼承的關系!
應用:重寫以后,當創建子類物件以后,通過子類物件呼叫子父類的同名引數的方法時,實際執行的時子類重寫父類的方法
重寫的規定:方法的宣告:權限修飾符 回傳值型別 方法名(形參串列) throws 例外的型別
//方法體
}
約定俗稱:子類中的叫重寫的方法,父類中的叫被重寫的方法
A. 子類重寫的方法的方法名和形參串列與父類被重寫的方法的方法名和形參串列相同
B. 子類重寫的方法的權限修飾符不小于父類被重寫的方法的權限修飾符
>特殊情況:子類不能重寫父類中宣告為private權限的方法
C. 回傳值型別:
>父類被重寫的方法的回傳值型別是void,則子類重寫的方法的回傳值型別只能是void
>父類被重寫的方法的回傳值型別是A型別,則子類重寫的方法的回傳值型別可以是A類或A的子類
//這樣算重寫,String是Object的子類
pulbic Object show(){//父類方法
}
public String show(){//子類方法
}
//這樣不是重寫,回傳值型別不同
pulbic void catch(){//父類方法
}
pulbic int catch(){//子類方法
}
>父類被重寫的方法的回傳值型別是基本資料型別(比如:double).則子類重寫的方法的回傳值型別必須是相同的(double)
D.子類重寫的方法拋出的例外型別不大于父類被重寫的方法拋出的例外型別.(可以拋出例外型別更少、例外型別更小、不拋出例外)
子類和父類中的同名同引數的方法要么都宣告為非static的(考慮重寫),要么都宣告為static的(不是重寫),
注意:A 父類的靜態方法不能被子類覆寫為非靜態方法, B 父類的靜態方法不能被子類覆寫為靜態方法,(這兩點與上面的那句話表達的是一個意思)
E.靜態方法不能被重寫
原因:重寫依賴于類的實體,而靜態方法和類實體并沒有什么關系,而且靜態方法和類實體并沒有什么關系,而且靜態方法在編譯時就已經確定,而方法重寫是在運行時確定的(動態系結),(也可以說java多型體現在運行時、而static在編譯時、與之相悖)
《JAVA編程思想》中多次的提到:方法是靜態的、他的行為就不具有多型性,靜態方法是與類、而非單個物件相關聯的,
區分方法的多載和重寫
多載:不表現為多型性,
重寫:表現為多型性,
從編譯和運行的角度來看:
多載,是指允許存在多個同名方法,而這些方法的引數不同,編譯器根據方法不同的引數串列,對同名方法的名稱做修飾,對于編譯器而言,這些同名方法就成了不同的方法,他們的呼叫地址在編譯期間就系結了,Java的多載是可以包括父類和子類的,即子類可以多載父類的同名不同引數的方法,
所以:對于多載而言,在方法呼叫之前,編譯器就已經確定了所要呼叫的方法,這稱為“早系結”或“靜態系結”;
而對于多型,只有等到方法呼叫的那一刻,解釋運行器才會確定所要呼叫的具體方法,這稱為“晚系結”或“動態系結”;
參考一句Bruce Eckel的話:“不要犯傻,如果它不是晚系結,它就不是多型,”
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290249.html
標籤:java
上一篇:# Day01-Java基礎
