java基礎中重載和重寫的區別

一、使用“方法的重載機制”和不使用“方法的重載機制”的比較

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
若有不正之處,請多多諒解並歡迎批評指正,不甚感激

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章