zoukankan      html  css  js  c++  java
  • Java 中 override 和 overload 区别

    问题出现:

      即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来说,经常容易弄混淆。

      有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?

    其他人是怎么做的:

      写类似比较的博客非常之多,无非也就是分开介绍,然后比较区别。

      好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。

    可以这样理解:

      override 更准确的翻译应该是推翻,重写。

      overload 更准确的翻译应该是过载。

      如果你不是新手,看到这个解释的时候应该有点茅塞顿开的感觉,

      因为直译之后的意思就是这两个方式的功能概括。

      所以:

      override 个人喜欢叫做方法重写;

      overload 个人喜欢叫做方法过载。

    分析:

      为什么叫方法重写:

        1.父类中的方法满足不了需要,子类可以推翻父类中的方法。
        2.同样的方法名称,参数列表,返回类型,抛出的异常(或者是父类抛出的异常的子类),子类重写一个。
        3.所以方法重写要求很严格,除了方法体内部的实现和访问权限,其他的都要和父类中需要被重写的方法保持一致。
        有一点要特别注意,方法重写之后访问权限可以不同:

          可以扩大访问权限,但是不能降低访问权限。

          可以看作是对子类的兼容性和拓展性要求的折衷妥协吧。

        注意:被重写的方法访问权限不能为 private,因为 private 修饰的方法子类没有访问权限,更不要提重写。

      为什么叫方法过载:

        1.过载指的是应对不同的参数列表而产生的方法过载。
        2.所以方法过载要求方法名称必须相同,参数列表必须不同;
        3.访问权限,返回类型,抛出的异常之类的可以相同也可以不同。

          使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。

        注意:如果某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重载;
        如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

    练习一下:

    class A {
     protected int method1(int a, int b) { return 0; }
    }
    
    public class B extends A{ 
     public int method1(int a, int b) { return 0; }
     // private int method1(int a, int b) { return 0; } 
     // private long method1(int a, int b) { return 0; } 
     public short method1(int a, long b) { return 0; }
     private int method1(int a, long b) { return 0; }
    }
    
    (参考答案预警!你不打算在心里演算一下么?)

    参考答案:

    class A {
     protected int method1(int a, int b) { return 0; }
    }
    
    public class B extends A{ 
     public int method1(int a, int b) { return 0; } // 正确,重写父类方法,可以扩大访问权限
     // private int method1(int a, int b) { return 0; } // 错误,重写父类方法,不能降低了访问权限
     // private long method1(int a, int b) { return 0; } // 错误,重写父类方法,不能改变返回值类型
     public short method1(int a, long b) { return 0; } // 正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
     private int method1(int a, long b) { return 0; }/ /正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
    }

    小结:

    override 方法重写,也叫方法覆盖;
      要求与被重写的方法:
        名称相同,
        参数列表相同,
        返回类型相同,
        抛出的异常相同(或者是父类抛出的异常的子类)。
      被重写的方法访问权限不能为 private

    overload 方法过载;
      要求过载的方法:
        方法名称必须相同;
        参数列表必须不同;
        访问权限,返回类型,抛出的异常可以相同也可以不同。

    传送门:https://blog.51cto.com/13508140/2339876
    本文系笔者原创
    转载请注明出处
    —————————————

  • 相关阅读:
    C# checklistbox控件用法总结(怎样得到多选的值,以及动态加载数据)
    Tomcat service.xml详解
    修改windows服务器上面tomcat启动窗口的名称
    表空间
    安装selenium遇到的问题
    oracel 锁表查询
    Can not perform this action after onSaveInstanceState
    Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.HEADSET_PLUG
    Java.lang.IllegalStateException Activity has been destroyed
    StrictMode 使用
  • 原文地址:https://www.cnblogs.com/ryelqy/p/10916437.html
Copyright © 2011-2022 走看看