Java之Overload与Override讲解

本文介绍了Java中方法重载和方法重写的基本概念。方法重载指一个类中同名但参数不同的方法,目的是方便调用;方法重写是子类定义与父类方法类型、名字、参数完全相同的方法,可改变父类状态和行为。还给出程序实例及两者区别对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能。 大大提高了开发人员的工作效率。

1. 基本概念

1.1 方法重载(Overload)概念

  • 定义:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即参数个数、参数类型或参数顺序不同。重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
    注意:参数顺序不同,也属于方法重载,这一点将在后文以java程序为进行说明。
  • 规则:
    1)方法名称必须相同;
    2)参数列表必须不同,即参数个数、参数类型或参数顺序中任有一个不同。
    3)方法的返回类型可以相同也可以不同,对此无限制。
    4)若仅满足方法的返回类型不同,不属于方法重载。
  • 补充说明:
    1)仅仅参数名称不同,或方法类型不同,不构成重载。例如,int min(int x, int y)与int min(int z, int y)不构成方法重载,同理,int min(int x, int y)与void min(int z, int y)不构成方法重载。
    2)构造方法的名字与类名相同,且构造方法无返回类型,构造方法可以重载。
    3)声明为final的方法不能被重载。
    4)声明为static的方法不能被重载,但是能够被在此声明。
    5)main 方法也可以被重载。
  • 方法重载的目的:
    1)方法重载的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
    2) 重载的最直接作用是方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写过个函数名或方法名的重复步骤。

1.2 方法重写(Override)概念

  • 定义:在子类中定义一个方法,这个方法的类型和父类的方法的类型一致或是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数类型和父类的方法完全相同。子类如此定义的方法称为子类重写的方法(不属于新增的方法)。方法重写又叫方法覆盖。
  • 补充说明:
    1)发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)。
    2)子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)。
    3)子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)。
    4)如果子类想使用被隐藏的方法,必须使用关键字super。
  • 方法重写的目的:
    1)子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。
    2)重写方法既可以操作继承的成员变量,也可以操作子类新声明的成员变量。
    3)重写是为了增强类的重用性和复用性,扩展性;重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西。

2. 程序实例

2.1 方法重载

package com.test;

class MyClass {
    int height;
    MyClass() {
        System.out.println("调用无参数构造函数");
        height = 4;
    }
    MyClass(int i) {
        System.out.println("调用有参数构造函数");
        height = i;
    }
    void info(int a, String s) {
        System.out.println(s+":房子高度为 "+height + " 米");
    }
    void info(String s, int a) {
        System.out.println("参数顺序不同构成重载:" +s + ": 房子高度为 " + height + " 米");
    }
    int info(int b, int a) {
        System.out.println("方法修饰符可以不同" +": 房子高度为 " + height + " 米");
        return a+b;
    }
    float info(int b, int a, float c) {
        System.out.println("方法返回值类型可以不同" +": 房子高度为 " + height + " 米");
        return a+b;
    }
}
public class Ytt {
    public static void main(String[] args) {
        MyClass t = new MyClass(3);
        t.info(1,"测试1");
        t.info("测试2",2);  //参数顺序不同构成重载
        t.info(1,2);        //方法修饰符可以不同,方法返回值类型不影响重载
        t.info(1,2,6f);  //方法返回值类型可以不同
        //重载构造函数
        new MyClass();  
    }
}

2.2 方法重写

package com.test;

class MyClass {
    void info(String s) {
        System.out.println("我是父类:"+s);
    }
}
class MyClassRoom extends MyClass{
    void info(String s) {
        System.out.println("我是子类:"+s);
    }
    int info(String s,int c) {
        System.out.println("我是子类:"+s);
        return c;
    }
}
public class Ytt {
    public static void main(String[] args) {
        MyClass t = new MyClass();
        t.info("测试1");
        MyClassRoom r = new MyClassRoom ();
        r.info("测试2");  //方法重写
        r.info("测试3",3);  //不属于方法重写;严格意义上说,方法重载发生在一个类内部,因此也不属于方法重载。
    }
}

3. 两者区别

3.1 对比表格

区别点重写重载
参数列表必须不同必须相同
返回类型无限制必须相同
异常可以修改异常只能减少或删除
访问权限可以修改不可以降低方法的访问权限

3.2 其他参考链接

https://www.runoob.com/java/java-override-overload.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就是二二二二婷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值