详解Java中的重写和重载 | 动态绑定和静态绑定

简介: 详解Java中的重写和重载 | 动态绑定和静态绑定

一.重载

重载(overload),Java中为了提高编程效率,允许我们使用方法重载,具体体现在,对于多个方法,他们的方法名相同,但参数列表不同,我们则将这种行为称为方法的重载,比如我们在定义一个加法的方法的时候,为了方便我们程序的调用,我们就可以通过更改参数列表的方法来体现出方法的不同

public class Test_1 {
    public static int add(int a,int b) {
        return a+b;
    }
    public static int add(int a,int b,int c) {
        return a+b+c;
    }
    public static float add(float a,float b) {
        return a+b;
    }
    public static float add(int a,float b) {
        return a+b;
    }
    public static float add(float a,int b) {
        return a+b;
    }
    public static void main(String[] args) {
        add(1,2);
        add(1,2,3);
        add(1.2f,2.3f);
        add(1.2f,2);
        add(1,2.2f);  
    }
}



在这里需要注意的有以下几点:


  • 方法名必须相同
  • 参数列表必须不同 (参数的个数不同、参数的类型不同、类型的次序必须不同)
  • 与返回值类型是否相同无关

我们可以演示以下,如果只是方法的返回值不同会是怎么样的效果:

    public static int add(int a,int b) {
        return a+b;
    }
    public static float add(int a,int b) {
        return a+b;
    }

 

当我们出现这样的情况的时候,编译器就会报错了,所以我们在实现重载的时候,切记返回值是否相同并无任何意义,不同的返回值并不会实现重载



编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法


二.重写

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


重写规则:


  • 子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
  • 被重写的方法返回值类型可以不同,但是必须是具有父子关系的
  • 重写的方法访问权限必须大于等于父类的方法。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected
  • 父类被static、private修饰的方法、构造方法都不能被重写。
  • 重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验

比如我们用个简单的动物类来举例,我们定义一个动物类,里面有俩个参数,分别是名字和年龄,然后还有一个eat方法,然后我们分别写了Dog类和Cat类来继承了Animal类在继承的子类中,我们分别重写了eat方法

class Animal {
    String name;
    int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println("动物正在吃食物");
    }
}
class Dog extends Animal{
    public Dog(String name,int age) {
        super(name,age);
    }
    public void eat() {
        System.out.println(this.name + "正在吃狗粮~~~");
    }
}
class Cat extends Animal{
    public Cat(String name,int age) {
        super(name,age);
    }
    public void eat() {
        System.out.println(this.name + "正在吃猫粮~~~");
    }
}


对于我们子类继承后重写的方法,我们也可以使用多态的思想来调用他们

    public static void main(String[] args) {
        Cat cat = new Cat("布偶",2);
        Dog dog = new Dog("哈士奇",3);
        cat.eat();
        dog.eat();
    }

 

输出结果:



三.重载和重写的区别

重载就相当于的我们为了一次性射中多个目标,所以一次性射出了很多箭


重写就相当于我们对于之前的箭矢进行了针对性的改进,然后射出去这跟改进后的箭矢



区别

重写(override)

重载(override)

参数列表

不能修改

必须修改

返回类型

不能修改(除非构成父子关系)

可以修改

访问限定修饰符

可以降低限制但不能提高限制

可以修改


俩种编程方法很相似,但是体现的编程思维是完全不同的


重载是属于静态绑定,编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法;而重写属于是动态绑定,在刚开始的时候,我们确实是调用的父类中的方法,然后在我们实现了重写后,编译器在调用的时候,就会自己去寻找合适的需要调用的方法


目录
相关文章
|
11天前
|
Java
【Java基础面试十八】、说一说重写与重载的区别
这篇文章阐述了Java中重写与重载的区别:重载是同一个类中方法名相同但参数列表不同的方法之间的关系,而重写是子类中方法与父类中相同方法名和参数列表的方法之间的关系,且子类的返回值应小于等于父类,访问修饰符应大于等于父类。
【Java基础面试十八】、说一说重写与重载的区别
|
13天前
|
存储 Java
|
11天前
|
Java
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
|
11天前
|
Java
【Java基础面试十九】、构造方法能不能重写?
这篇文章指出Java中的构造方法不能被重写,因为构造方法必须与类名相同,而重写要求子类方法与父类方法同名,允许构造方法重写将违背这一规则。
【Java基础面试十九】、构造方法能不能重写?
|
18天前
|
Java
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
30 0
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
|
2月前
|
存储 Java 索引
java 中为什么重写 equals 后需要重写 hashCode
java 中为什么重写 equals 后需要重写 hashCode
52 8
|
9天前
|
Java
描述 Java 中的重载和重写
【8月更文挑战第22天】
12 0
|
9天前
|
存储 Java 索引
|
3月前
|
Java 编译器
在 Java 中,重写(Override)和重载(Overload)是两种不同的概念,用于实现多态性。它们有着不同的作用和使用场景。
在 Java 中,重写(Override)和重载(Overload)是两种不同的概念,用于实现多态性。它们有着不同的作用和使用场景。
|
4月前
|
Java
【Java开发指南 | 第二十五篇】Java 重写(Override)与重载(Overload)
【Java开发指南 | 第二十五篇】Java 重写(Override)与重载(Overload)
33 1
下一篇
云函数