Java 方法重写与重载的区别 示例 重载多数相加求和 重写toString()和equals()

75 篇文章 2 订阅
本文详细介绍了Java中的方法重载(overloading)和重写(overriding)概念,包括它们的区别和应用场景。方法重载发生在同一类中,要求方法名相同但参数列表不同;而方法重写发生在父类与子类之间,子类必须保持与父类方法相同的签名并可能提供不同的实现。文中通过实例代码展示了如何进行方法重载和重写,并强调了重写时需要注意的异常处理和权限问题。
摘要由CSDN通过智能技术生成

Java 方法重写与重载的区别

  • 重载:在同一个类中,当方法名相同,形参列表不同的时候 多个方法构成了重载
  • 重写:在不同的类中,子类对父类提供的方法不满意的时候,要对父类的方法进行重写。
名称\属性English位置修饰符返回值方法名参数异常方法体
重载overload同一类中------必须相同不同无关必须不同
重写override父类子类中父类<子类父类>子类相同<=

重载

  • 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
  • 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
  • 最常用的地方就是构造器的重载。

条件

  • 形参类型形参个数形参顺序不同
// 类型不同
add(int num1)   add(double num1)
// 个数不同
add()   add(int num1)   add(int num1,int num2)
// 顺序不同
add(int num1,double num2)   add(double num1,int num2)
  • 只有返回值不同不构成方法的重载
// 返回值不同,不构成方法重载
int a(String str)    void a(String str)
  • 只有形参的名称不同,不构成方法的重载
// 形参的名称不同,不构成方法重载
int a(String str)    int a(String s)

代码示例

public class Test001 {
    public static void main(String[] args) {

        System.out.println(add(10, 20));

        //System.out.println(add(add(20,40),80));
        System.out.println(add(20, 40, 80));

        //System.out.println(add(add(30,60),add(90,120)));
        System.out.println(add(30, 60, 90, 120));

        //System.out.println(add(9.8,4.7));
        System.out.println(add(9.8, 4.7));
    }

    public static int add(int num1, int num2) {
        return num1 + num2;
    }

    public static int add(int num1, int num2, int num3) {
        return num1 + num2 + num3;
    }

    public static int add(int num1, int num2, int num3, int num4) {
        return num1 + num2 + num3 + num4;
    }

    public static double add(double num1, double num2) {
        return num1 + num2;
    }
}
30
140
300
14.5

重写

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

  • 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

  • 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。

    • 例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception异常,因为 ExceptionIOException的父类,只能抛出 IOException的子类异常。

条件

  • 子类的方法名字和父类必须一致,参数列表(个数,类型,顺序)也要和父类一致。

例如对toStringequals重写

重写示例

首先我们创建简易的Person
public class Person {
    String name;
    int age;
    double height;

    public Person() {  //空构造器
    }

    //全参构造器
    public Person(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }
}
创建Test类来调用
public class Test {
    public static void main(String[] args) {
        Person fyz = new Person("fyz", 18, 178);
        Person zc = new Person("fyz", 18, 178);

        System.out.println(fyz);
        System.out.println(zc);
        System.out.println(fyz.equals(zc));
    }
}

运行结果

com.skprimin.demo2.Person@1b6d3586
com.skprimin.demo2.Person@4554617c
false

众所周知Java所有类均默认继承自Object类,我们查阅Object源码得知

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public boolean equals(Object obj) {
    return (this == obj);
}
重写toString()equals()

显然我们对这个默认方法并不满意,故而重写这两个方法,IDEA中可以使用快捷键Alt + Insert

@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", height=" + height +
            '}';
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return age == person.age &&
            Double.compare(person.height, height) == 0 &&
            Objects.equals(name, person.name);
}
再次运行Test测试类

得到了我们想要的运行结果

Person{name='fyz', age=18, height=178.0}
Person{name='fyz', age=18, height=178.0}
true
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SK Primin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值