閱讀目錄 方法重載 方法重寫 閱讀目錄 閱讀目錄 方法重載 方法重寫 方法重載 方法重寫 一、方法重載 1)在同一個類中,如果想創建多個名稱相同的方法,那麼就會用到方法重載。方法重載通過參數區分名稱相同的方法,參數可以類型不同,數目不同,或者順序不同 package com.example; pub ...
閱讀目錄
一、方法重載
1)在同一個類中,如果想創建多個名稱相同的方法,那麼就會用到方法重載。方法重載通過參數區分名稱相同的方法,參數可以類型不同,數目不同,或者順序不同
package com.example; public class T{ public void show(){ System.out.println("show()"); } /*error public int show(){ return 100; } */ public void show(int i){ System.out.println("show" + "(" + i + ")"); } public void show(String str){ System.out.println("show" + "(" + str + ")"); } public void show(int i, String str){ System.out.println("show" + "(" + i + ", " + str + ")"); } public void show(String str, int i){ System.out.println("show" + "(" + str + ", " + i + ")"); } }
package com.example; public class Test{ public static void main(String[] args){ T t = new T(); t.show(); t.show(10); t.show("張三"); t.show(10, "張三"); t.show("張三", 10); } }
運行結果: show() show(10) show(張三) show(10, 張三) show(張三, 10)
- 方法名稱相同時,不能通過改變返回值的類型來進行區分,只能通過改變參數的類型、參數的數目、或者參數的順序來對方法進行區分
2)類中可以創建多個構造器也是利用了方法重載
package com.example; public class T{ public T(){ } public T(int i){ } public T(String str){ } }
3)方法重載時,如果參數列表都是基本數據類型,編譯器會將傳入的參數自動匹配相應的類型。如果沒有相匹配的類型,編譯器會將參數進行類型提升或者窄化轉換
例1:
package com.example; public class T{ public void f1(char i) {System.out.print("f1(char) ");} public void f1(byte i) {System.out.print("f1(byte) ");} public void f1(short i) {System.out.print("f1(short) ");} public void f1(int i) {System.out.print("f1(int) ");} public void f1(long i) {System.out.print("f1(long) ");} public void f1(float i) {System.out.print("f1(float) ");} public void f1(double i) {System.out.print("f1(double) ");} public void f2(byte i) {System.out.print("f2(byte) ");} public void f2(short i) {System.out.print("f2(short) ");} public void f2(int i) {System.out.print("f2(int) ");} public void f2(long i) {System.out.print("f2(long) ");} public void f2(float i) {System.out.print("f2(float) ");} public void f2(double i) {System.out.print("f2(double) ");} public void f3(short i) {System.out.print("f3(short) ");} public void f3(int i) {System.out.print("f3(int) ");} public void f3(long i) {System.out.print("f3(long) ");} public void f3(float i) {System.out.print("f3(float) ");} public void f3(double i) {System.out.print("f3(double) ");} public void f4(int i) {System.out.print("f4(int) ");} public void f4(long i) {System.out.print("f4(long) ");} public void f4(float i) {System.out.print("f4(float) ");} public void f4(double i) {System.out.print("f4(double) ");} public void f5(long i) {System.out.print("f5(long) ");} public void f5(float i) {System.out.print("f5(float) ");} public void f5(double i) {System.out.print("f5(double) ");} public void f6(float i) {System.out.print("f6(float) ");} public void f6(double i) {System.out.print("f6(double) ");} public void f7(double i) {System.out.print("f7(double) ");} public void showChar(){ char i = 0; System.out.println("char: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } public void showByte(){ byte i = 0; System.out.println("byte: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } public void showShort(){ short i = 0; System.out.println("short: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } public void showInt(){ int i = 0; System.out.println("int: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } public void showLong(){ long i = 0; System.out.println("long: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } public void showFloat(){ float i = 0; System.out.println("float: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } public void showDouble(){ double i = 0; System.out.println("double: "); f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i); System.out.println("\n"); } }
package com.example; public class Test{ public static void main(String[] args){ T t = new T(); t.showChar(); t.showByte(); t.showShort(); t.showInt(); t.showLong(); t.showFloat(); t.showDouble(); } }
運行結果: char: f1(char) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double) byte: f1(byte) f2(byte) f3(short) f4(int) f5(long) f6(float) f7(double) short: f1(short) f2(short) f3(short) f4(int) f5(long) f6(float) f7(double) int: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double) long: f1(long) f2(long) f3(long) f4(long) f5(long) f6(float) f7(double) float: f1(float) f2(float) f3(float) f4(float) f5(float) f6(float) f7(double) double: f1(double) f2(double) f3(double) f4(double) f5(double) f6(double) f7(double)
- char 類型比較特別,當重載的方法中沒有 char 類型時,傳入的參數會提升為 int 類型,而不是 byte 類型,例如:f2 方法和 f3 方法,這兩個方法都沒有重載 char 類型的參數,所以傳入的參數直接提升為 int 類型,從運行結果的第一行可以看到這一特性
例2:
package com.example; public class T{ public void f1(char i) {System.out.print("f1(char) ");} public void f1(byte i) {System.out.print("f1(byte) ");} public void f1(short i) {System.out.print("f1(short) ");} }
package com.example; public class Test{ public static void main(String[] args){ int i = 0; T t = new T(); //t.f1(i); // error t.f1((char)i); t.f1((byte)i); t.f1((short)i); } }
運行結果: f1(char) f1(byte) f1(short)
- 如果傳入的參數需要窄化轉型,那麼必須要顯式地對傳入的參數進行強制類型轉換
[ 返回頂部 ]
二、方法重寫
1)方法重寫只存在於子類中(繼承或實現介面)
package com.example; public class Person{ // 父類 public void speak(){ System.out.println("Person: speak()"); } }
package com.example; public class Man extends Person{ // 子類 public void speak(){ // 重寫父類的 speak 方法 super.speak(); // 調用父類的 speak 方法 System.out.println("Man: speak()"); } }
運行結果: Person: speak() Man: speak()
- 方法重寫時,子類方法的方法名稱、返回值類型、參數列表都應該與父類中的方法相同
2)子類中重寫的方法的訪問控制許可權不能低於父類中方法的訪問控制許可權
package com.example; public class Person{ // 父類 public void p1(){ } protected void p2(){ } void p3(){ } private void p4(){ } }
package com.example; public class Man extends Person{ // 子類 public void p1(){ // 父類的 p1 方法的訪問控制許可權是 public,那麼子類的 p1 方法的訪問控制許可權只能是 public } /* public void p2(){ // 可以是 public 或者 protected } */ protected void p2(){ } /* public void p3(){ } protected void p3(){ } */ void p3(){ } /* public void p4(){ } protected void p4(){ } void p4(){ } */ private void p4(){ } }
3)繼承關係中,子類也可以對父類的方法進行方法重載
package com.example; public class Person{ // 父類 public void speak(int i){ System.out.println("Person: speak" + "(" + i + ")"); } }
package com.example; public class Man extends Person{ // 子類 public void speak(String str){ // 方法重載 System.out.println("Man: speak" + "(" + str + ")"); } }
package com.example; public class Test{ public static void main(String[] args){ Man m = new Man(); m.speak("張三"); } }
運行結果: Man: speak(張三)
4)Java 為了保證重寫方法時不會出錯,所以引入了 @Override
package com.example; public class Person{ // 父類 public void speak(int i){ System.out.println("Person: speak" + "(" + i + ")"); } }
package com.example; public class Man extends Person{ // 子類 /* @Override public void speak(String str){ System.out.println("Man: speak" + "(" + str + ")"); } */ // error,用了 @Override ,那麼 @Override 下麵的方法必須是方法重寫,否則編譯時會出錯 @Override public void speak(int i){ System.out.println("Man: speak" + "(" + i + ")"); } }
package com.example; public class Test{ public static void main(String[] args){ Man m = new Man(); m.speak(10); } }
運行結果: Man: speak(10)
[ 返回頂部 ]
參考資料:
《Java 編程思想》第4版