以前的文章咱們介紹了一下 Java 中的繼承,接下來咱們繼續看一下 Java 中的繼承。java
在有些時候,咱們經過類繼承的方式能夠獲取父類的方法,可是有些時候父類爲咱們提供的方法並不徹底符合咱們的需求,這時候咱們就要對類方法進行重寫,以下:ide
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() 方法,方法中發發明和參數相同,方法體不一樣,這其實就是類方法的重寫。函數
重寫須要遵循「兩同兩小一大」原則(通常都是相同):spa
一、兩同code
1)、方法名稱相同對象
1>、void 和 基本類型時子類和父類必須相同blog
2>、引用類型時子類必須小於或等於父類繼承
2)、參數列表相同ci
二、兩小:字符串
1)、子類方法的返回值類型小於或等於父類
2)、子類方法所拋出的異常小於或等於父類
三、一大
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多態性的不一樣表現,重寫是父類與子類之間多態性的一種表現,重載能夠理解成多態的具體表現形式。
重載和重寫能夠用下面這張圖來形象的表示。重載咱們能夠認爲是多種表現形式,每種表現形式都能實現本身的功能。重寫是在原有基礎上增強本身的功能。