(二)、重写与重载

一、方法的重写(@Override)

子类继承父类后,定义了一个和父类中一模一样的方法,即方法名和参数的定义完全相同。这时候子类要实现这个方法,就称为对父类方法的重写。

其实就是在子类中把父类本身有的方法重新写一遍,重写方法体。但要注意子类函数的访问权限不能低于父类。

总结:

  1.发生在父类与子类之间。

  2.方法名,参数列表,返回类型(除子类中方法的返回类型是父类中返回类型的子类)必须相同。

  3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public > protected > default >  private)。

  4.重写方法一定不能抛出新的检查异常或者比重写方法申明更加宽泛的检查型异常。

  例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

注:静态方法不能被重写

  Java中,static关键字修饰的方法就是静态方法。

  所谓静态就是指,在编译之后所分配的内存会一直存在,即不会被回收,直到程序退出内存才会释放这个空间;不通过实例化就能使用成员。

在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.run();
    }
}
 
class Animal {
    public void run() {
        System.out.println("animal is running");
    }
}
 
class Dog extends Animal {
  @Override
public void run() { System.out.println("Dog is running"); super.run();//调用父类的run方法 } }

运行结果如下:

二、方法的重载(Overload)

在一个类中,有同名的方法,但是方法中有不同的参数列表。

参数类型、参数个数、参数顺序不同则视为重载。

但是,重载对返回类型没有要求,可以相同也可以不同,即不能通过返回类型是否相同来判断重载。

总结:

  1.重载Overload是一个类中多态性的一种表现。

  2.重载要求同名方法的参数列表不同(参数类型、参数个数甚至是参数顺序)。

  3.重载的时候,返回值类型可以相同也可以不相同,不能以返回型别作为重载函数的区分标准。

public class Father{
    public static void main(String[] args) {
        Father s = new Father();
        s.sayHello();
        s.sayHello("wintershii");
    }

    public void sayHello(){
        System.out.println("Hello");
    }

    public void sayHello(String name) {
        System.out.println("Hello" + " " + name);
    }
}

运行结果:

三、重写与重载的区别

1.方法的重写和重载都是实现多态的方式。

  区别在于前者实现的是运行时的多态性,而后者实现的是编译时的多态性。

2.重写放生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容性的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。

3.重载发生在一个类中,同名的方法如果有不同的参数列表则视为重载。

posted @ 2019-08-04 21:00  黎先生  阅读(242)  评论(0编辑  收藏  举报