• Java 重写、重载,这篇文章看了就明白


    回顾一下,我们已经知道了什么面向对象的三大特性, 还有不理解的同学,建议仔细阅读 java基础—封装、继承、多态,跟着里面的案例进行敲,细细揣摩,每遍都会有不同的收货

    接下来我们来看两个 重点概念,重写跟重载,也是面试环节的重点讨论对象

    1. 什么是重写(Override)?

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

    也就是说:重写就是子类去重新写父类可以给你访问的方法,你的方法跟父类的方法名字,返回值,参数类型一模一样,外部的基本结构不变,方法里面的核心,逻辑内容自己重新写

    比如:

    父类 Animal 的方法

    
    class Animal{
       public void sleep(){
          System.out.println("动物会睡觉");
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    子类 猫 Cat

    class Cat extends Animal {
       public void sleep(){
          System.out.println("猫会睡觉");
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这边 Cat 类就重写了父类 Animal 的sleep方法,跟着父类一样,无返回值void, 无参数,核心逻辑重新写

    这里我们也可以发现,重写也是多态的实现方式之一

    重写也可以称作是方法覆盖,看你怎么好记了。。

    总结一下:

    重写(方法覆盖)也具有一定的条件,当程序具备这些条件的时候就能构成重写:

    • 不用说, 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;

    • 接着就是我们说的,覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表;

    注意事项:

    • 私有的方法不能被继承,所以不能被覆盖;(上一章介绍继承的时候我们也说过了)

    • 构造方法不能被继承,所以也不能被覆盖;

    • 覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高

    • 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少

    • 方法覆盖只是和方法有关,和属性无关;

    • 静态方法不存在覆盖(不是静态方法不能覆盖,是静态方法覆盖意义不大);

    以上注意事项,面试也经常会提问,还需要多下功夫,理解记忆

    2. 什么是重载(Overload)?

    关于什么是重载?这边我们先不去研究他,先来看一个没有使用重载的代码例子

    这边有一个需求: 分别计算 int,double,long 这三种类型的和

    我们是这么写的

    public static int sumInt(int a , int b){
      return a + b;
    }
    public static long sumLong(long a , long b){
      return a + b;
    }
    public static double sumDouble(double a , double b){
      return a + b;
    }
    
    public static void main(String[] args) {
      int x1 = 5;
      int x2 = 10;
      int retValue1 = sumInt(x1 , x2);
      System.out.println(x1 + "+" + x2 + "=" + retValue1);
      long y1 = 5L;
      long y2 = 10L;
      long retValue2 = sumLong(y1 , y2);
      System.out.println(y1 + "+" + y2 + "=" + retValue2);
      double z1 = 5.0;
      double z2 = 10.0;
      double retValue3 = sumDouble(z1, z2);
      System.out.println(z1 + "+" + z2 + "=" + retValue3);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    可以看到写了三个方法,起了三个不用的名字。倘若有10个,20个类的方法呢? 按照这种形式就得取很多名字来记忆,增加了编程压力,代码也不美观

    为了解决这种问题,就有了重载的概念,现在我们将上面改造改造

    
    public static int sum(int a , int b){
      return a + b;
    }
    public static long sum(long a , long b){
      return a + b;
    }
    public static double sum(double a , double b){
      return a + b;
    }
    public static void main(String[] args) {
      int x1 = 5;
      int x2 = 10;
      int retValue1 = sum(x1 , x2);
      System.out.println(x1 + "+" + x2 + "=" + retValue1);
      long y1 = 5L;
      long y2 = 10L;
      long retValue2 = sum(y1 , y2);
      System.out.println(y1 + "+" + y2 + "=" + retValue2);
      double z1 = 5.0;
      double z2 = 10.0;
      double retValue3 = sum(z1, z2);
      System.out.println(z1 + "+" + z2 + "=" + retValue3);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    发现什么不同没,我们可以看到三个方法采用了相同的名字 sum,里面的参数类型不同,这就是重载

    总结一下:

    重载:在一个类中定义多个同名的方法,但每个方法有不同的参数类型,不同参数个数,参数的顺序不同也是不同

    public static void sumInt(long b , int a){
            
        }
        public static void sumInt(int a ,  long b){
           
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    写在最后:
    以上便是java中的重写、重载的内容了

    推荐阅读

    java基础——面向对象

    java基础——封装、继承、多态

  • 相关阅读:
    计算机毕业设计(附源码)python-新型冠状病毒防控咨询网站
    后台管理----新建和编辑hooks 封装
    传奇GOM引擎时装功能如何添加
    样式和格式代码
    力扣刷题-字符串-反转字符串
    中文汉字转拼音首字母
    全网最全:Mysql六种约束详解
    各语言转wasm-js调用
    【牛客刷题】反转固定区间链表、每k个节点一组反转
    QT 开发遇到问题(网上有解决方案的)记录
  • 原文地址:https://blog.csdn.net/qq_42482058/article/details/127726901