Java學習筆記17---成員方法的重載與重寫


重載是指,一個類中定義了一個成員方法后,通過修改參數個數、參數類型或參數順序,重新實現該方法,則這兩個方法互為對方的重載方法。

重寫是指,子類重新實現父類的成員方法。

 

重載后的方法,與原方法相比:

(1).方法名相同,參數個數、參數類型及參數順序至少有一個不同;

(2).返回值類型與訪問權限修飾符可以相同也可以不同,只修改這兩項不能算重載;

(3).靜態成員方法也可以重載,重載后的方法也可以是非靜態成員方法;

(4).可以有多個重載方法。

 

子類重寫后的方法,與父類的方法相比:

(1).方法名、參數個數、參數類型及參數順序必須一致;

(2).返回值類型為基本數據類型時,不可以修改,返回值為類類型時,可以修改,具體參見筆記13

(3).訪問權限修飾符可以修改也可以不修改,如果修改的話,必須要大於父類方法的訪問范圍;

(4).靜態成員方法也可以重寫,但重寫后的方法只是被隱藏,並未覆蓋父類的方法,具體參見筆記12

(5).一個子類只能重寫父類的某個成員方法一次,否則,子類就會出現重名方法,會報錯。

 

 重載是同一個類內部的多個成員方法互為重載方法,重寫是子類的成員方法重寫了父類的成員方法;重載一般是為了創建一組要完成相似任務的成員方法,重寫的目的是為了實現多態,實現多態有3個條件:繼承、重寫、向上轉型,缺一不可

 

作者: 蟬蟬

請尊重作者勞動成果,轉載請在標題注明“轉載”字樣,並標明原文鏈接:

 http://www.cnblogs.com/chanchan/p/7906876.html 

 

下面是簡單的程序示例。

Person類是Student類的父類,TestMain類是測試類,具體代碼如下:

Person類的代碼:

package human;

public class Person {
    String name;
    int age;
    String gender;

    public Person() {
        
    }
    
//筆記17:重載:方法名不變,參數的個數、類型及順序至少與原方法有一個不同
//可以更改返回值類型及訪問權限修飾符,但不是必須的,只修改這兩項也不算重載    
    public int overLoadP(int i, String s) {
        System.out.println("i = " + i + ", " + s);
        return i+1;
    }

//    public char overLoadP(int i, String s) {
//        return i+1;
//    }

    //可以更改返回值類型及訪問權限修飾符
    protected char overLoadP(int i) {
        System.out.println("i = " + i);
        return (char)(i+2);
    }

    public int overLoadP(int i, int n) {
        System.out.println("i = " + i + ", n = " + n);
        return i+n;
    }

    public int overLoadP(String s, int i) {
        System.out.println(s + ", i = " + i);
        return i;
    }

    static void overLoadPS() {
        System.out.println("靜態成員方法可以重載嗎");
    }

    void overLoadPS(int i) {
        System.out.println("靜態成員方法可以重載");
    }
    
}

 

Student類的代碼:

package human;

public class Student extends Person {
    String stuNumber;
    int score;

    public Student() {
        
    }    
    
//筆記17:重寫:方法名、參數的個數、類型及順序都要與父類方法一致
//子類重寫時,只有返回值為類類型時,才可以更改返回類型,且只能改為返回值類型的子類
//子類訪問權限修飾符的范圍要大於父類的
//    public char overLoadP(int i, String s) {
    public int overLoadP(int i, String s) {
        System.out.println("子類重寫:i = " + i + ", " + s);
        return i+1;
    }

}

 

TestMain類的代碼:

package human;

public class TestMain {
    public static void main(String[] args) {
        
        Person per = new Person();
        Student stu = new Student();
        
        per.overLoadP(1);
        per.overLoadP(1, 2);
        per.overLoadP(1, "bokeyuanchanchan");
        per.overLoadP("bokeyuanchanchan", 1);
        per.overLoadPS(2);
        per.overLoadPS();
        
        stu.overLoadP(1,"博客園蟬蟬");
}

 

輸出結果如下:

1 i = 1
2 i = 1, n = 2
3 i = 1, bokeyuanchanchan
4 bokeyuanchanchan, i = 1
5 靜態成員方法可以重載
6 靜態成員方法可以重載嗎
7 子類重寫:i = 1, 博客園蟬蟬

 

分析如下:

關於重載:

(1).最先定義了public int overLoadP(int i, String s)這個方法,方法名為overLoadP,有兩個參數,分別為int型和String型,返回值為int型。

(2).隨后又定義了3個重名的方法,分別為:

protected char overLoadP(int i)

public int overLoadP(int i, int n)

public int overLoadP(String s, int i)

這3個方法與原方法的參數不同點分別在於,參數個數不同、參數類型不同、參數順序不同,這3個方法都是原方法的重載方法,這4個方法互為對方的重載方法。

其中protected char overLoadP(int i),返回值類型與訪問權限修飾符也與原方法不同,可見這兩項是可以修改的,但只修改這兩項並不能算重載,見(3)。

(3).Person類中下面注釋掉的代碼行,與第1個方法僅返回值不同,會出現“Duplicate method voerLoadP(int, String) in type Person”的錯誤。也就是說,僅返回值類型不同是不能算重載的。

// public char overLoadP(int i, String s) {

// return i+1;

// }

(4).由結果可知,靜態成員方法也可以重載。

關於重寫:

(5).子類重寫了父類的public int overLoadP(int i, String s),方法名、參數個數、參數類型、參數順序及返回值類型都與父類一致。

對於代碼中注釋掉的行,不注釋的話會提示返回值類型與父類返回值不一致的錯誤。

// public char overLoadP(int i, String s) {


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM