认识Java——重载和重写

本文详细介绍了方法重载和方法重写的基本概念及应用。通过实例代码展示了如何在一个类中定义多个同名但参数不同的方法实现重载,以及子类如何通过重写父类方法来实现多态。适合初学者理解面向对象编程的关键特性。

方法重载

方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。方法重载一般用于创建一组任务相似但是参数不同的方法。

方法重载有以下几种规则:
1.方法中的参数列表必须不同。比如:参数个数不同或者参数类型不同。
2.重载的方法中允许抛出不同的异常
3.可以有不同的返回值类型,但是参数列表必须不同
4.可以有不同的访问修饰符

示例代码

public class Test {
    void f(int i) {
        System.out.println("i=" + i);
    }

    void f(float f) {
        System.out.println("f=" + f);
    }

    void f(String s) {
        System.out.println("s=" + s);
    }

    void f(String s1, String s2){
        System.out.println("s1+s2="+(s1+s2));
    }

    void f(String s, int i){
        System.out.println("s="+s+",i="+i);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.f(3456);
        test.f(34.56f);
        test.f("abc");
        test.f("abc","def");
        test.f("abc",3456);
    }
}

运行结果

i=3456
f=34.56
s=abc
s1+s2=abcdef
s=abc,i=3456

方法重写

子类可以继承父类的方法,但如果子类对父类的方法不满意,想在里面加入适合自己的一些操作时,就需要将方法进行重写。并且子类在调用方法中,优先调用子类的方法。

比如 Animal 类中有bark()这个方法代表了动物叫,但是不同的动物有不同的叫法,比如狗是汪汪汪,猫是喵喵喵。

当然在方法重写时要注意,重写的方法一定要与原父类的方法语法保持一致,比如返回值类型,参数类型及个数,和方法名都必须一致。

public class Animal {
    //类方法
    public void bark() {
        System.out.println("动物叫!");
    }
}
public class Dog extends Animal {
       //重写父类的bark方法
        public void bark() {
        System.out.println("汪!汪!汪!");
    }
}
<think>我们正在讨论Java中的重载(Overloading)重写(Overriding)。根据引用材料,我们可以总结如下: 重载(Overloading): - 发生在同一个中(或者父子之间也可以,但通常指同一个)。 - 方法名相同,但参数列表不同(参数型、个数、顺序不同)。 - 返回型可以相同也可以不同,仅返回型不同不足以构成重载。 - 访问修饰符可以不同。 - 发生在编译时(静态绑定)。 重写(Overriding): - 发生在子父类之间(继承关系中)。 - 子方法方法名、参数列表、返回型(在Java5及以后,返回型可以是父类方法返回型的子)必须与父类方法相同。 - 访问修饰符不能比父类方法更严格(例如,父类是protected,子可以是public或protected,但不能是private)。 - 抛出异常不能比父类方法抛出更多或更宽泛的异常(子可以不抛出异常,或者抛出父类方法抛出的异常的子)。 - 发生在运行时(动态绑定)。 区别: - 作用范围:重载在同一个中,重写在父子中。 - 参数要求:重载要求参数不同,重写要求参数相同。 - 返回型:重载无要求,重写要求相同或是子型。 - 访问权限:重载无要求,重写不能缩小访问范围。 - 异常:重载无要求,重写不能抛出更宽泛的异常。 - 绑定时间:重载是编译时(静态绑定),重写是运行时(动态绑定)。 应用场景: - 重载:同一个中需要多个功能相似但参数不同的方法。例如,一个打印方法,可以打印整数、字符串等。 - 重写:子需要改变或扩展父类中某个方法的行为时使用。 示例: - 引用[5]提供了一个例子:ShapeRectangle。 public class Shape { public void display() { System.out.println("This is a shape"); } } public class Rectangle extends Shape { // 重写父类的display方法 @Override public void display() { System.out.println("This is a rectangle"); } // 重载display方法,参数不同 public void display(String color) { System.out.println("This rectangle is " + color); } } 另外,关于构造方法: - 构造方法可以重载(即一个中可以有多个参数列表不同的构造方法)。 - 构造方法不能被重写(因为子不能继承父类的构造方法,所以不存在重写构造方法,但子构造方法会调用父类构造方法,可以是隐式或显式的super())。 现在,我们按照用户要求,用结构化的方式来回答: 注意:要生成相关问题。 </think>### Java重载重写的概念、区别及使用示例 #### 1. **核心概念** - **重载(Overloading)** 在同一个中定义**多个同名方法**,但要求**参数列表不同**(参数型、数量或顺序不同)。 特点: - 编译时确定调用哪个方法(静态绑定)[^3] - 与返回值型无关(仅参数列表不同) ```java // 重载示例:参数型不同 void print(int num) { System.out.println("整数: " + num); } void print(String text) { System.out.println("字符串: " + text); } // ✅ 合法重载 ``` - **重写(Overriding)** 子**覆盖父类方法**,要求**方法名、参数列表、返回型完全相同**(协变返回型除外)。 特点: - 运行时动态绑定(动态多态性)[^3] - 遵循“两同两小一大”规则: - 方法名+参数相同 - 子返回型 ≤ 父类返回型(协变) - 子异常 ≤ 父类异常 - 子访问权限 ≥ 父类(如父类`protected`,子可为`public`) ```java // 重写示例 class Animal { void move() { System.out.println("动物移动"); } // 父类方法 } class Dog extends Animal { @Override void move() { System.out.println("狗奔跑"); } // ✅ 子重写 } ``` --- #### 2. **核心区别** | **特性** | 重载 (Overloading) | 重写 (Overriding) | |------------------|----------------------------------|----------------------------------| | **作用范围** | 同一个(或父子间) | 父子之间 | | **参数要求** | 必须不同 | 必须完全相同 | | **绑定时机** | 编译时静态绑定 [^3] | 运行时动态绑定 [^3] | | **返回值** | 可不同 | 必须相同或协变(子返回型≤父类)| | **访问权限** | 无限制 | 子权限≥父类权限 | | **异常处理** | 无限制 | 子异常≤父类异常 | | **目的** | 增强方法灵活性(同功能不同参数)| 实现多态(定制父类行为)[^2] | --- #### 3. **应用场景与示例** - **重载典型场景**: 处理不同型数据输入(如`System.out.println()`支持多种参数型) ```java class Calculator { // 重载加法:参数数量不同 int add(int a, int b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } // ✅ 合法重载 } ``` - **重写典型场景**: 子定制父类行为(如不同动物实现不同移动方式) ```java class Bird extends Animal { @Override void move() { System.out.println("鸟飞行"); // ✅ 覆盖父类方法 } } ``` - **综合示例**(引用[5]): ```java public class Shape { public void display() { System.out.println("This is a shape"); } } public class Rectangle extends Shape { @Override public void display() { // ✅ 重写父类方法 System.out.println("This is a rectangle"); } // ✅ 重载:新增参数 public void display(String color) { System.out.println("This rectangle is " + color); } } ``` --- #### 4. **关键注意事项** 1. **构造方法**: - 可重载(多个不同参数构造方法) - **不可重写**(子不继承父类构造方法)[^3] 2. **静态方法**: - 可重载 - **不可重写**(静态方法属于,无多态性) 3. **`private/final`方法**: - 不可重写(子无法访问) --- ### 总结 - **重载** = **静态多态**:通过参数差异扩展方法功能(编译期决策)[^1][^4] - **重写** = **动态多态**:通过继承实现行为定制(运行期决策)[^2][^3] ```mermaid graph LR A[多态性] --> B[重载-静态] A --> C[重写-动态] B --> D[同一中] C --> E[父子间] ``` > “重载提升代码灵活性,重写实现多态威力。” —— 引用[2][^2][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值