Override, 主要是因为父类的功能无法满足需求,我们又不能直接修改父类的情况下 ,我们通过子类重写,来实现新的功能。
package Lession11;import java.util.ArrayList;import java.util.List;/*** 老紫竹JAVA基础培训(11),方法的Override.*** @**/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开始,允许返回类型和父类不同,但必须是其子类或者实现类(对于接口)
往往教导我们大家要好好学习天天向上,