【JavaSE】重载和重写

简介: 【JavaSE】重载和重写

重载(Overload)

       概念:简单的说,方法名字相同,参数列表不同,返回值可相同也可不同(无要求),当我们调用这个函数时,传参不同,编译器就会依照传参的类型,调用对应的方法。

代码示例:

public static int add(int x, int y) {
        return x + y;
    }
    public static double add(double x, double y) {
        return x + y;
    }
    public static double add(double x, double y, double z) {
        return x + y + z;
    }
    public static void main(String[] args) {
        int a=add(1, 2); // 调用add(int, int)
        System.out.println(a);
        double b=add(1.5, 2.5); // 调用add(double, double)
        System.out.println(b);
        double c=add(1.5,2.5, 3.5); // 调用add(double, double, double)
        System.out.println(c);
    }

当满足以下条件时才构成方法重载:

  • 方法名必须相同
  • 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
  • 与返回值类型是否相同无关
  • 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法


重写 (override)

  概念:重写也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

代码示例:

class shape {
    public void draw() {
        System.out.println("画形状");
    }
}
class triangle extends shape {
    @Override//注解
    public void draw() {
        System.out.println("画三角形");
    }
}
class rectangle extends shape {
    @Override//注解
    public void draw() {
        System.out.println("画矩型");
    }
}
class dog extends shape {
    @Override
    public void draw() {
        System.out.println("画一个小狗 🐕");
    }
}
public class Test_11_13 {
    public static void main(String[] args) {
        shape[] s = {new triangle(), new rectangle(), new dog()};//向上引型
        for (int i = 0; i < s.length; i++) {
            s[i].draw();
        }
    }
}

代码运行结果:



观察代码可以发现,当我们调用draw()方法时,输出的信息并不是我们在父类中编写的draw()方法中的信息,而是我们在他子类中编写的同名的draw()方法输出的信息,这就是子类中的draw()方法对父类中的draw()方法进行了重写。


   重写的注意事项:

子类在重写父类的方法时,必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致。

被重写的方法返回值类型可以不同,但是必须是具有父子关系的。

访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方 法就不能声明为 protected。

父类被static、private修饰的方法、构造方法都不能被重写。

重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 darw), 那么此时编译器就会发现父类中没有darw方法, 就会编译报错, 提示无法构成重写。


重载和重写的区别


1688711522703.png

相关文章
|
2月前
|
Java 编译器 数据安全/隐私保护
Java 重写(Override)与重载(Overload)详解
在 Java 中,重写(Override)和重载(Overload)是两个容易混淆但功能和实现方式明显不同的重要概念。重写是在子类中重新定义父类已有的方法,实现多态;重载是在同一类中定义多个同名但参数不同的方法,提供多种调用方式。重写要求方法签名相同且返回类型一致或为父类子类关系,而重载则关注方法参数的差异。理解两者的区别有助于更好地设计类和方法。
|
3月前
|
Java
描述 Java 中的重载和重写
【8月更文挑战第22天】
18 0
|
Java 编译器
Java重写(Override)&重载(Overload)
重写(Override)概述 Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类和一个名为 Cat 的子类,其中 Cat 类继承了 Animal 类。Animal 类中有一个名为 move() 的方法,Cat 类可以对这个方法进行重写。 Animal 类中的 move() 方法不是private 类型,因此它可以被其子类重写。在 Cat 类中,使用相同的名称和参数列表来重新定义了 move() 方法,并且使用 @Overrid
161 0
|
6月前
|
Java
Java重写(Override)与重载(Overload)
Java重写(Override)与重载(Overload)
|
6月前
|
Java 编译器
【JAVA】关于重写(Override)与重载(Overload)
【JAVA】关于重写(Override)与重载(Overload)
106 0
|
6月前
|
Java 编译器
详解Java中的重写和重载 | 动态绑定和静态绑定
详解Java中的重写和重载 | 动态绑定和静态绑定
179 0
|
Java 编译器 程序员
Java 的重载(overload)和重写(override)
重载和重写都是面向对象编程中的概念,但我们或许还听说过一种叫做覆写(overwrite)的概念。C++ 是拥有这个概念的,Java 只有 overload 和 override,Python 只有隐式的 overload 和 override,没有 overwrite 的概念。在重载(overload)、重写(override)和覆写(overwrite)中,我们一般对前面两个比较熟悉,对最后一个会略微陌生一些。
183 1
Java中重写与重载
Java中重写与重载
|
Java 编译器
Java中的重载和重写
Java中的重载和重写
105 0