java重写父类方法

重写父类方法

子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。例如鸟类都包含了飞翔方法,其中有一种鸟是特殊鸟类——鸵鸟,因此它也会从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,所以,鸵鸟需要重写鸟类的方法。

我们先看下面的程序


public class Bird {
    //Bird 类的fly()方法
    public void fly()
    {
        System.out.println("我在天空可劲的飞啊");
    }

}

public class Ostrich {
    // 重写Bird类的fly()方法
    public void fly() {
        System.out.println("我能在地上可劲跑");

    }

    public static void main(String[] args) {
        // 创建Ostrich对象
        Ostrich os = new Ostrich();
        // 执行Ostrich对象的fly()方法,将输出“我在地上可劲的跑”
        os.fly();
    }
}

我能在地上可劲跑

可见上面的程序执行之后,执行os.fly()时执行的不再是Bird类的fly()方法,而是执行Ostrich类的fly()方法。

这种子类包含与父类同名方法的现象被称为方法重写(Override),也被成为方法覆盖。可以说子类重写了弗雷德方法,也可以说子类覆盖了父类的方法。

这里有个需要注意的地方,方法的重写要遵循“两同两小一大”规则:

  • “两同”即方法名相同、形参列表相同
  • “两小”指的是子类方法返回值类型应比父类方法返回值类型更小或更像等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
  • “一大”指的是子类方法的访问权限应比父类方法的访问权限更大或者相等。

另外还有个需要和注意的地方就是:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法(static),一个是实例方法。

super 限定

super 是 Java 提供的一个关键字, super 用于限定该对象调用它从父类继承得到的实例变量或方法。

super不能出现在static修饰的方法中:

  • 正如this不能出现在static 修饰的方法中一样, super也不能出现在static修饰的方法中。static修饰的方法是属于类的,该方法的调用者可能是一个雷,而不是对象,因而super限定也就失去了意义。

如果子类定义了和父类同名的实例变量,则会发生子类实例变量隐藏父类实例变量的情形。在正常情况下,子类里定义的方法直接访问该实例变量默认会访问到子类中定义的实力变量,无法访问到父类中被隐藏的实例变量。在子类定义的实例方法中可以通过super来访问父类中被隐藏的实例变量,如上段代码。

我们对上稍作修改,看一下super怎么用

Bird类不变,所以在此不再贴代码了。

public class Ostrich extends Bird {
    // 重写Bird类的fly()方法
    public void fly() {
        super.fly(); //①
        System.out.println("我能在地上可劲跑");

    }

    public static void main(String[] args) {
        // 创建Ostrich对象
        Ostrich os = new Ostrich();
        // 执行Ostrich对象的fly()方法,将输出“我在地上可劲的跑”
        os.fly();
//      super.fly();  //② 
    }
}


猜你喜欢

转载自blog.csdn.net/baozhiqiangjava/article/details/80361282
今日推荐