Java面向对象程序设计- 方法重写

阅读:47

1.为什么需要方法重写?

之前讲过方法重载(Overload),是在一个类中,多个方法名相同的方法。也讲过,继承,子类继承父类,子类拥有父类的成员变量和方法。

当继承父类方法时候,发现该方法不符合子类的需求,需要重写或扩展,那么我们怎么办呢?答案是,我们可以对父类的方法进行重写。

2.方法重写概念

方法重写(Override),是子类对父类的方法进行重写编写,返回值和形参都不能改变,叫做方法重写。也就是壳子不可以改变。

我们通过一个例子,假如父类Animal定义eat方法,都吃素食,但是有个子类Tiger,是食肉动物,我们进行重写:

Animal类:

public class Animal {

    public void eat(){
        System.out.println("I'm a vegetarian");
    }
}

Tiger类:

public class Tiger extends Animal {

    @Override
    public void eat() {
        System.out.println("I eat meat");
    }

    public static void main(String[] args){
        Tiger tiger = new Tiger();
        tiger.eat();
    }
}

我们运行Tiger类结果为:I eat meat。

因为我们对父类Animal的eat方法进行重写,方法执行子类Tiger的eat的方法。

3.super关键字

现在有个问题,当子类重写了父类的方法,我们想调用父类的方法,该怎么办呢?

答案是通过super关键字调用,super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。

我们现在对Tiger的eat改造下:

public class Tiger extends Animal {

    @Override
    public void eat() {
        super.eat();
    }

    public static void main(String[] args){
        Tiger tiger = new Tiger();
        tiger.eat();
    }
}

运行Tiger,结果为:I'm a vegetarian。

这是因为子类虽然重写了eat方法,但是通过super关键字调用了父类的eat方法。

还记得继承吗?当我们继承父类的时候,通过new创建一个子类的对象,实际怎么运行的呢?

首先调用是父类的构造器,然后再调用子类的构造器,创建子类的对象,那么是怎么做到的呢?

在Java中,除了Object类之外,所有的类的构造器第一行如果没有默认super(…),就会默认加上super(),以此来调用父类的构造器。

4.重写与重载之间的区别

Java面向对象(OOP)的三大特性中,多态是个重要的概念,那么重写父类和子类之间多态的表现,重载是多态的具体表现。

那么,我们总结下:

  • 方法重载是在同一个类中定义了多个方法名相同,而它们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。

  • 方法重写是发生在子类和父类中方法名、参数个数、参数类型相同和返回值相同,也就是同一个壳子,就称为重写(Overriding)。

  • 方法重载是同一个类的多态性表现,而方法重写是子类与父类的多态性表现。

     

读后有收获,请打赏。更多精彩内容,请关注微信公众号。有疑问请加QQ交流群:454792501

全部评论

发表评论
更多精彩内容,请关注微信公众号