Java 從入門到進階之路(十一)


之前的文章我們介紹了一下 Java 中的繼承,接下來我們繼續看一下 Java 中的繼承。

在有些時候,我們通過類繼承的方式可以獲取父類的方法,但是有些時候父類為我們提供的方法並不完全符合我們的需求,這時候我們就要對類方法進行重寫,如下:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         Student student = new Student();
 4         student.name = "張三";
 5         student.age = 18;
 6         student.city = "北京";
 7         student.userInfo(); // 我叫張三,今年18歲
 8 
 9         Teacher teacher = new Teacher();
10         teacher.name = "李四";
11         teacher.age = 28;
12         teacher.city = "上海";
13         teacher.userInfo(); // 我叫李四,今年28歲,來自上海
14     }
15 }
16 
17 class Person {
18     String name;
19     int age;
20 
21     void userInfo() {
22         System.out.println("我叫" + name + ",今年" + age + "歲");
23     }
24 }
25 
26 class Student extends Person {
27     String city;
28 }
29 
30 class Teacher extends Person {
31     String city;
32 
33     void userInfo() {
34         System.out.println("我叫" + name + ",今年" + age + "歲," + "來自" + city);
35     }
36 }

在上面的代碼中,我們分別定義了 Student 和 Teacher 兩個列,且都繼承了 Person 類,不同的是我們在 Teacher 類中定義了一個和父類 Person 類相同的 userInfo() 方法,方法中發發明和參數相同,方法體不同,這其實就是類方法的重寫。

重寫需要遵循“兩同兩小一大”原則(一般都是相同):

1、兩同

  1)、方法名稱相同

    1>、void 和 基本類型時子類和父類必須相同

    2>、引用類型時子類必須小於或等於父類

  2)、參數列表相同

2、兩小:

  1)、子類方法的返回值類型小於或等於父類

  2)、子類方法所拋出的異常小於或等於父類

3、一大

  1)、子類的訪問權限大於或等於父類

上面的例子我們其實已經說了“兩同”了,下面我們看一下“兩小”中的 子類方法的返回值類型小於或等於父類

 1 class Person {
 2     String name;
 3     int age;
 4 
 5     void userInfo() {
 6         System.out.println("我叫" + name + ",今年" + age + "歲");
 7     }
 8 
 9     double num(){ return 1.23; }
10 
11     Person person(){ return null; }
12 
13     Student student(){ return null; }
14 }
15 
16 class Student extends Person {
17 
18     double num(){ return 4.56; }
19 
20 //    int num(){ return 8; }  編譯錯誤,基本類型必須相同
21 
22     Student person(){ return null; }
23 
24 //    Person student(){ return null; } 編譯錯誤,引用類型時必須小於或等於父類
25

方法重寫(Override)很容易讓我們想起來之前說過的方法重載(Overload),我們再來看一下之前說過的重載。

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         Aoo aoo = new Aoo(); // 創建一個 Aoo 對象
 4         aoo.foo(); // foo 無參
 5         aoo.foo(123); // foo 整型參數123
 6         aoo.foo("abc"); // foo 字符串參數zhangsan
 7         aoo.foo("abc",123); // foo 字符串+整型參數abc123
 8         aoo.foo(123,"abc"); // foo foo 整型+字符串參數123abc
 9     }
10 }
11 
12 class Aoo {
13     void foo() {
14         System.out.println("foo 無參");
15     }
16 
17     void foo(int num) {
18         System.out.println("foo 整型參數" + num);
19     }
20 
21     void foo(String str) {
22         System.out.println("foo 字符串參數" + str);
23     }
24 
25     void foo(String str, int num) {
26         System.out.println("foo 字符串+整型參數" + str + num);
27     }
28 
29     void foo(int num, String str) {
30         System.out.println("foo 整型+字符串參數" + num + str);
31     }
32 }

重載規則:

  • 被重載的方法必須改變參數列表(參數個數或類型不一樣);
  • 被重載的方法可以改變返回類型;
  • 被重載的方法可以改變訪問修飾符;
  • 被重載的方法可以聲明新的或更廣的檢查異常;
  • 方法能夠在同一個類中或者在一個子類中被重載。
  • 無法以返回值類型作為重載函數的區分標准。

重寫與重載之間的區別

 

區別點 重載方法 重寫方法
參數列表 必須修改 一定不能修改
返回類型 可以修改 一定不能修改
異常 可以修改 可以減少或刪除,一定不能拋出新的或者更廣的異常
訪問 可以修改 一定不能做更嚴格的限制(可以降低限制)

方法的重寫(Overriding)和重載(Overloading)是java多態性的不同表現,重寫是父類與子類之間多態性的一種表現,重載可以理解成多態的具體表現形式。

  • (1)方法重載是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同而類型和次序不同,則稱為方法的重載(Overloading)。
  • (2)方法重寫是在子類存在方法與父類的方法的名字相同,而且參數的個數與類型一樣,返回值也一樣的方法,就稱為重寫(Overriding)。
  • (3)方法重載是一個類的多態性表現,而方法重寫是子類與父類的一種多態性表現。

重載和重寫可以用下面這張圖來形象的表示。重載我們可以認為是多種表現形式,每種表現形式都能實現自己的功能。重寫是在原有基礎上加強自己的功能。

 

 


免責聲明!

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



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