Override, 主要是因為父類的功能無法滿足需求,我們又不能直接修改父類的情況下 ,我們通過子類重寫,來實現新的功能。
package Lession11;
import java.util.ArrayList;
import java.util.List;
/**
* 老紫竹JAVA基礎培訓(11),方法的Override.<br>
*
*
* @author 老紫竹 JAVA世紀網(java2000.net)
*
*/
public class Lession11 {
public static void main(String[] args) {
// 單純基類的測試
Base b1 = new Base();
b1.test();
b1.test("");
b1.test(new Object());
System.out.println();
// 單純子類的測試
Sub s1 = new Sub();
s1.test();
s1.test("");
// 靜態方法調用,會根據變量的類型,而不是對象的類型
s1.test(new Object());
// 上面的代碼等同於這個
Sub.test(new Object());
System.out.println();
// 基類的變量,子類的實例的測試
Base b2 = new Sub();
b2.test();
b2.test("");
// 靜態方法調用,會根據變量的類型,而不是對象的類型
b2.test(new Object());
// 上面的代碼等同於這個
Base.test(new Object());
}
}
class Base {
public void test() {
System.out.println("Base.test()");
}
public Base test(String name) {
System.out.println("Base.test(String)");
return this;
}
public final void test(int age) {
System.out.println("final Base.test(int)");
}
// 靜態方法屬於類,不屬於實例,所以不存在override問題
public static void test(Object obj) {
System.out.println("static Base.test(Object)");
}
}
class Sub extends Base {
// 標准的覆蓋方法
public void test() {
System.out.println("Sub.test()");
}
// JDK5開始的覆蓋方法
// 允許返回類型和父類不同,但必須是其子類或者實現類
public Sub test(String name) {
System.out.println("Sub.test()");
return this;
}
// 靜態方法屬於類,不屬於實例,所以不存在override問題
public static void test(Object obj) {
System.out.println("static Sub.test(Object)");
}
}
測試:
1 自行增加多個參數的覆蓋使用,並測試運行結果
2 測試修改返回類型,比如
public String test()
看看編譯結果,熟悉錯誤信息。
總結:
1 覆蓋要求參數類型順序必須和父類相同
2 從JDK5開始,允許返回類型和父類不同,但必須是其子類或者實現類(對於接口)