一、使用“方法的重載機制”和不使用“方法的重載機制”的比較
1.不使用“方法的重載機制”,分析程序存在的缺點?
package 重載;
public class test01 {
public static void main(String[] args) {
//調用方法
int sumInt = sumInt(1, 2);
System.out.println(sumInt); //3
double sumDouble = sumDouble(1.0, 2.0);
System.out.println(sumDouble); //3.0
long sumLong = sumLong(1L, 2L);
System.out.println(sumLong); //3
}
//定義一個方法,可以計算兩個int類型數據的和
public static int sumInt(int a,int b){
return a + b;
}
//定義一個方法,可以計算兩個double類型數據的和
public static double sumDouble(double a,double b){
return a + b;
}
//定義一個方法,可以計算兩個long類型數據的和
public static long sumLong(long a,long b){
return a + b;
}
}
- 以上程序的案例可以看出,sumInt、sumDouble、sumLong方法雖然功能不同,但是功能是相似的,都是求和。在程序當中功能相似的方法,分別起了三個不同的名字,這對於程序員來說,調用方法的時候不方便,程序員需要記憶更多的方法,才能完成調用。
2.使用“方法的重載機制”,分析程序的優點
package 重載;
public class test02 {
public static void main(String[] args) {
System.out.println(sum(1,2)); //3
System.out.println(sum(1.0,2.0)); //3.0
System.out.println(sum(1L,2L)); //3
}
public static int sum(int a,int b){
return a + b;
}
public static double sum(double a,double b){
return a + b;
}
public static long sum(long a,long b){
return a + b;
}
}
- 以上程序可以看出,調用方法的時候就像在使用一個方法一樣
- 參數的類型不同,對應調用的方法就不同,此時區分方法不再依靠方法名了,依靠的是參數的數據類型
- 程序員調用方法的時候,比較方便。雖然調用的是不同的方法,但是就感覺在使用一個方法一樣,不需要記憶個更多的方法名。還有就是代碼更加的美觀了
二、方法的重載
1.方法的重載又被稱爲:overload
2.什麼時候考慮使用方法重載?
- 功能相似的時候,儘可能讓方法名相同。但是,功能不同的時候,儘可能讓這兩個方法的名字不同(比如做加法和減法)
3.什麼條件滿足之後構成了方法重載?
- 在同一個類當中(都在OverloadTest01這個類中)
- 方法名相同(都是m1或者都是m2或者都是m3)
- 參數列表不同:
- 數量不同(方法裏有參數和沒有參數)
- 順序不同(方法裏參數數據類型的順序)
- 類型不同(方法裏參數的數據類型)
package 重載;
public class OverloadTest01 {
public static void main(String[] args) {
m1();
m1(10);
m2(1,2.0);
m2(2.0,1);
m3(10);
m3(3.0);
}
//以下兩個方法構成重載
public static void m1(){}
public static void m1(int a){}
//以下兩個方法構成重載
public static void m2(int a,double b){}
public static void m2(double a,int b){}
//以下兩個方法構成重載
public static void m3(int x){}
public static void m3(double x){}
}
4.方法重載和什麼有關係,和什麼沒有關係?
- 方法重載和方法名+參數列表有關係
- 方法重載和返回值類型無關
public static void x(){}
public static int x(){
return 1;
}
- 方法重載和修飾符列表無關
void y(){}
public static void y(){}
三、方法的重寫
package 重寫;
public class Test {
public static void main(String[] args) {
//創建子類對象
Cat cat = new Cat();
//調用方法
cat.move(); //打印出 貓在走貓步
}
}
//父類:動物
class Animal{
//成員方法
public void move(){
System.out.println("動物在移動");
}
}
//子類:貓
class Cat extends Animal{
//Cat的move方法應該輸出:貓在走貓步
//Animal中的move方法已經無法滿足Cat了
//所以要在Cat類中對Animal類中的move方法進行重新定義(方法的覆蓋,方法的重寫,Overwrite,Override)
public void move(){
System.out.println("貓在走貓步");
}
}
1.什麼時候方法要進行重寫?
- 如果父類中的方法已經無法滿足當前子類的業務需求,需要將父類中的方法進行重新寫一遍,也就是重寫
2.子類如果重寫父類中的方法之後,子類對象一定調用的是重寫之後的方法
- 上面程序只會打印出“貓在走貓步”
- 如果子類對象的重寫方法給註釋掉,則會打印出“動物在移動”
3.發生方法覆蓋的條件:
- 第一:發生在具有繼承關係的兩個類之間
- 第二:必須具有相同的方法名(move),相同的返回值類型(void),相同的參數列表(重寫方法中沒有參數,與父類成員方法中相同)
- 第三:重寫的方法不能比被重寫的方法擁有更低的訪問權限(比如子類重寫的方法中如果將public刪除掉,程序就會報錯。如果將父類成員方法的public刪除,則不會報錯)
- 第四:重寫的方法不能比被重寫的方法拋出更寬泛的異常。(如果在子類重寫的方法中拋出異常
throws Exception
,程序就會報錯,因爲父類中的成員方法沒有拋異常) - 第五:私有的方法不能被覆蓋(比如父類中有自己獨有的方法,該方法不能被子類繼承)
- 第六:構造方法無法被覆蓋,因爲構造方法無法被繼承
- 第七:靜態的方法不存在覆蓋(比如父類中的static修飾的方法)
- 第八:覆蓋指的是成員方法,和成員變量無關
4.繼承最重要的作用:繼承複用,方法可以重寫,用來重新定義子類的行爲
如果對你有幫助,不如點個贊,也算是支持一下0.0
若有不正之處,請多多諒解並歡迎批評指正,不甚感激