Java 方法重載和多態
先來看看什麽是方法重載?
方法重載的要求是:方法名相同,參數列表不同(不同的參數類型或者參數順序或者參數個數)。至於方法的其他部分,如方法返回值類型和修飾符,與方法重載沒有任何關系。最好加上@Overload註解。
為什麽要用方法重載?
重載的目的是方便程序員調用方法。比如,System.out.println()這個函數是用來輸出的,當輸出的是整數時是用這個方法,當輸出一個字符串時還是用這個方法。根據傳入參數的不同,自動找到匹配的方法。
以下程序不使用方法重載,試著分析看看有什麽缺點。
public class methodtest07{
public static void main(String[] args){
//缺點:對於程序員來說,需要記憶三個不同的方法
System.out.println(Compute.sumint(128,42));
System.out.println(Compute.sumdouble(121.23,242.432));
System.out.println(Compute.sumlong(234L,3242L));
}
}
class Compute{
public static int sumint(int a,int b){
return a+b;
}
public static double sumdouble(double a,double b){
return a+b;
}
public static long sumlong(long a,long b){
return a+b;
}
}
上述代碼的缺陷就是程序員得記住三個不同的方法。(頭大)
結合代碼來看看哪些情況屬於方法重載?代碼後面有詳細的註釋。
//以下方法構成方法重載
public static void m1(int a){}
public static void m1(double a){}
public static void m2(int a,int b){}
public static void m2(int a){}
public static void m3(int a,double b){}
public static void m3(double a,int b){}
//以下m4方法不構成方法重載
public static void m4(int a){}
public static void m4(int b){} //方法重復,編譯無法通過
//m5方法不構成方法重載 方法的重載和方法的返回值類型無關
public static void m5(){}
public static int m5(){
return 100;
}
//m6不構成方法的重載 方法的重載和方法的修飾符列表無關
static void m6(){}
public static void m6(){}
}
總結一下,方法的重載:
1.發生在同一個類中
2.方法名相同
3.參數列表不同(參數的類型,個數,順序不同)
4.和返回值類型無關
5.和方法的修飾符列表無關
什麽是多態?
多態是指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而采用多種不同的行為方式(發送消息就是函數調用)。繼承在為多態的實現做了準備。子類繼承父類,我們可以編寫一個指向子類的父類類型引用,該引用既可以處理父類對象,也可以處理子類對象,當相同的消息發送給子類或者父類對象時,該對象就會根據自己所屬的引用而執行不同的行為,這就是多態。即多態性就是相同的消息使得不同的類做出不同的響應。
Java實現多態有三個必要條件:繼承,重寫,向上轉型。
繼承:在多態中必須存在有繼承關系的子類和父類。
重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。
向上轉型:在多態中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具備技能調用父類的方法和子類的方法。
只有滿足了上述三個條件,我們才能夠在同一個繼承結構中使用同一的邏輯實現代碼處理不同的對象,從而達到執行不同的行為。下面結合代碼理解。
public class Quadrangle {
// 實例化保存四邊形對象的數組對象
private Quadrangle[] qtest = new Quadrangle[6];
private int nextIndex = 0;
public void draw(Quadrangle q) { // 定義draw()方法,參數為四邊形對象
if (nextIndex < qtest.length) {
qtest[nextIndex] = q;
System.out.println(nextIndex);
nextIndex++;
}
public static void main(String[] args) {
// 實例化兩個四邊形對象,用於調用draw()方法
Quadrangle q = new Quadrangle();
q.draw(new Square()); // 以正方形對象為參數調用draw()方法
// 以平行四邊形對象為參數調用draw()方法
q.draw(new Parallelogramgle());
}
}
class Square extends Quadrangle { // 定義一個正方形類,繼承四邊形類
public Square() {
System.out.println("正方形");
}
}
// 定義一個平行四邊形類,繼承四邊形類
class Parallelogramgle extends Quadrangle {
public Parallelogramgle() {
System.out.println("平行四邊形");
}
}
輸出:
正方形
0
平行四邊形
1
從本實例運行的結果可以看出,以不同類對象為參數調用draw()方法可以處理不同的圖像類問題,程序員無須在所有的子類中定義執行相同功能的方法,只要實例化一個繼承父類的子類對象即可調用相應的方法,只要維護父類中的這個方法即可。
搜索微信公眾號“程序員考拉”,歡迎關註!
Java 方法重載和多態