原文地址:http://www.java2000.net/p11697
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开始,允许返回类型和父类不同,但必须是其子类或者实现类(对于接口)