【Java基础】方法重写Override

1.什么是方法重写

子类对父类中同名同参数的方法进行重写覆盖。

public class Person {

    public void say(){
        System.out.println("父类中的方法");
    }
}

public class Student extends Person{

}

执行以下语句时,调用的是父类中定义的方法,子类继承父类就具有了父类中的方法。

        Student student = new Student();
        student.say(); //父类中的方法

然而我们想自己写这个方法,不想用父类的。

public class Student extends Person{
    public void say(){
        System.out.println("子类中的方法");
    }
}

再次执行发现调用的是子类中的方法。

        Student student = new Student();
        student.say(); //子类中的方法

2.重写要求

(1)子类父类中,方法名和形参列表相同

(2)子类重写方法的权限修饰符不小于父类中方法的权限修饰符,例如父类中方法使用缺省,则子类中只能使用缺省或public,否则会报错。
image

(3)子类不能重写父类中声明为private权限的方法,因为父类中的方法权限为private,子类看不到,自然无法copy覆盖,此时在子类中写一样的方法相当于一个新的方法,而不是重写。

(4)返回值类型
    ① 父类中方法是void,则子类中方法只能是void。
    ② 父类中方法是A类型,则子类中方法可以是A类型或A类的子类。
    ③ 父类中方法是基本数据类型(double),则子类中方法必须是相同的基本数据类型(double)。

(5)子类重写方法抛出的异常 ≤ 父类被重写方法抛出的异常。

(6)static修饰
    ① 父类中使用static,子类中不使用,报错。
image

    ② 父类中使用static,子类中使用static,不会报错,子类的方法将父类的方法进行了隐藏,而非重写,参考链接

    ③ 父类中不使用static,子类中使用static,报错。
image

3.重载和重写的区别

  • 重载:多个同名方法,参数不同,编译器根据参数不同来区分,方法的调用地址在编译期就绑定了(早绑定或静态绑定),子类可以重载父类的同名不同参数的方法,不表现为多态性。

  • 重写:子类重写父类中的方法,自己实现,直到方法调用的那一刻,解释器才会确定所要调用的具体方法(晚绑定或动态绑定),变现为多态性

posted @ 2022-09-06 15:14  植树chen  阅读(67)  评论(0编辑  收藏  举报