• Java 重写(Override)与重载(Overload)


    Java 重写(Override)与重载(Overload)

     

    目录

    Java 重写(Override)与重载(Overload)

    重写(Override)

     

    方写重写的规则

    Super关键字的使用

    重载(Overload)

    实例

     

    重写与重载之间的区别


     

     

    重写(Override)

    重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写!

    重写的好处在于子类可以根据需要,定义特定于自己的行为。

    也就是说子类能够根据需要实现父类的方法。

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

    1. class Animal{
    2. public void move(){
    3. System.out.println("动物可以移动");
    4. }
    5. }
    6. class Dog extends Animal{
    7. public void move(){
    8. System.out.println("狗可以跑和走");
    9. }
    10. }
    11. public class TestDog{
    12. public static void main(String args[]){
    13. Animal a = new Animal(); // Animal 对象
    14. Animal b = new Dog(); // Dog 对象
    15. a.move();// 执行 Animal 类的方法
    16. b.move();//执行 Dog 类的方法
    17. }
    18. }

    以上实例编译运行结果如下:

    1. 动物可以移动
    2. 狗可以跑和走

    在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。

    这是由于在编译阶段,只是检查参数的引用类型

    然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。

    因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。

    思考以下例子:

    1. class Animal{
    2. public void move(){
    3. System.out.println("动物可以移动");
    4. }
    5. }
    6. class Dog extends Animal{
    7. public void move(){
    8. System.out.println("狗可以跑和走");
    9. }
    10. public void bark(){
    11. System.out.println("狗可以吠叫");
    12. }
    13. }
    14. public class TestDog{
    15. public static void main(String args[]){
    16. Animal a = new Animal(); // Animal 对象
    17. Animal b = new Dog(); // Dog 对象
    18. a.move();// 执行 Animal 类的方法
    19. b.move();//执行 Dog 类的方法
    20. b.bark();
    21. }
    22. }

    以上实例编译运行结果如下:

    1. TestDog.java:30: cannot find symbol
    2. symbol : method bark()
    3. location: class Animal
    4. b.bark();

    该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。

     

    方写重写的规则

    • 参数列表必须完全与被重写方法的相同;
    • 返回类型必须完全与被重写方法的返回类型相同;
    • 访问权限不能比父类中被重写的方法的访问权限更高。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
    • 父类的成员方法只能被它的子类重写。
    • 声明为final的方法不能被重写。
    • 声明为static的方法不能被重写,但是能够被再次声明。
    • 如果一个方法不能被继承,那么该方法不能被重写。
    • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
    • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
    • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
    • 构造方法不能被重写。
    • 如果不能继承一个方法,则不能重写这个方法。

     

    Super关键字的使用

    当需要在子类中调用父类的被重写方法时,要使用super关键字

    1. class Animal{
    2. public void move(){
    3. System.out.println("动物可以移动");
    4. }
    5. }
    6. class Dog extends Animal{
    7. public void move(){
    8. super.move(); // 应用super类的方法
    9. System.out.println("狗可以跑和走");
    10. }
    11. }
    12. public class TestDog{
    13. public static void main(String args[]){
    14. Animal b = new Dog(); /
    15. b.move(); //执行 Dog类的方法
    16. }
    17. }

    以上实例编译运行结果如下:

    1. 动物可以移动
    2. 狗可以跑和走

     

    重载(Overload)

    重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。

    每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

    只能重载构造函数

    重载规则

    • 被重载的方法必须改变参数列表;
    • 被重载的方法可以改变返回类型;
    • 被重载的方法可以改变访问修饰符;
    • 被重载的方法可以声明新的或更广的检查异常;
    • 方法能够在同一个类中或者在一个子类中被重载。

    实例

    1. public class Overloading {
    2. public int test(){
    3. System.out.println("test1");
    4. return 1;
    5. }
    6. public void test(int a){
    7. System.out.println("test2");
    8. }
    9. //以下两个参数类型顺序不同
    10. public String test(int a,String s){
    11. System.out.println("test3");
    12. return "returntest3";
    13. }
    14. public String test(String s,int a){
    15. System.out.println("test4");
    16. return "returntest4";
    17. }
    18. public static void main(String[] args){
    19. Overloading o = new Overloading();
    20. System.out.println(o.test());
    21. o.test(1);
    22. System.out.println(o.test(1,"test3"));
    23. System.out.println(o.test("test4",1));
    24. }
    25. }

     

    重写与重载之间的区别

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

     

  • 相关阅读:
    【Vivado】Xilinx UG994 Addressing for Block Designs
    【Leetcode刷题Python】199. 二叉树的右视图
    【数据结构基础_数组】Leetcode 48.旋转图像
    指针的进阶应用之双指针、三指针
    2、CKA-简单搭建K8s集群
    ATF lds和代码section如何关联
    g++无法找到动态库问题
    【目标】新学期计划与目标
    MyBatis是如何为Dao接口创建实现类的
    【流行框架】Spring
  • 原文地址:https://blog.csdn.net/2301_78835635/article/details/133417750