重写&重载

2019-02-14  本文已影响29人  竹鼠不要中暑

重写(Override)和重载(Overload)的区别

区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)

所以重写就是方法内的逻辑改变,但方法名、参数列表、返回值类型等都不能变;而重载则是方法名不变,其他都可以变,其中参数列表必须改变。

总结:

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,方法重载一个类多态性表现,而方法重写子类与父类的一种多态性表现。

举例

学习了这一节,我发现我在上一节“继承”中写的例子实际上就使用了重写和重载:

// 父类
public class Wolf {
    private int age;
    private double weight;
    protected String name = "wolf";

    public Wolf(int age) {
        this.age = age;
    }

    public Wolf(int age, double weight) {
        this(age);
        this.weight = weight;
    }

    public void eat() {
        System.out.println("Wolf: eat");
    }
}

Wolf类中写了两个构造函数,它们的参数列表不同,这就是重载,体现了一个类的多态性;

// 子类
public class Dog extends Wolf {
    protected String name = "dog";

    public Dog(int age, double weight) {
        super(age, weight); // 调用父类的构造方法
    }
    @Override
    public void eat() {
        System.out.println("Dog: eat");
    }

    public void eatTest() {
        super.eat(); // 调用与父子同名的父类成员方法
        this.eat();
    }

    public void printNameTest() {
        System.out.println("Father's name: " + super.name);
        System.out.println("My's name: " + name);
    }
}

Dog类中也有一个eat方法,和它的父类Wolf的eat方法参数列表和返回值类型相同(都无),只是输出的具体内容不同,这就是重写,体现了父类和子类的多态性。并且,如eatTeat方法中所示,在子类中可以通过super关键字调用父类被重写的方法。

上一篇下一篇

猜你喜欢

热点阅读