Java方法重载和方法重写的区别

本文详细解析了方法重载和重写的概念,包括它们的定义、代码示例及关键区别,如定义位置、参数列表、返回值类型等,帮助读者深入理解面向对象编程中的这两个核心概念。

方法重载:在同一个类中,允许存在多个同名方法,只要它们的参数列表不同,与修饰符和返回值类型无关,这样的多个同名方法之间构成重载。
参数列表:参数个数,参数类型,参数顺序
方法调用:根据实际传入的参数决定调用哪个方法。

代码示例:

public class OverloadTest {
    public static void main(String[] args) {
        //根据实际传入的参数决定调用哪个方法
        sum();
        System.out.println(sum(15));;
        System.out.println(sum(10.5d, 15.3d));;
    }

    public static void sum() {
        System.out.println(10 + 10);
    }

    private static int sum(int a) {
        return a + 10;
    }

    static double sum(double a, double b) {
        return a + b;
    }
}

方法重写:当父类中的方法对于子类来说不适用时,子类可以对从父类中继承来的方法进行重写/覆写。
方法调用:根据对象所属的类决定调用哪个类的方法。

代码示例:

class Father {
    void show() {
        System.out.println("Father show");
    }
}

class Son extends Father {
    @Override
    public void show() {
        System.out.println("Son show");
    }
}

public class OverrideTest {
    public static void main(String[] args) {
        Father f1 = new Father();
        f1.show();
        //多态引用,实际创建还是子类对象,调用的也是子类重写的show方法
        Father f2 = new Son();
        f2.show();
    }
}

区别总结

重载重写
定义位置同一个类中父类(接口)、子类(实现类)
方法名必须相同必须相同
形参列表必须不同必须相同
返回值类型无关如果是基本数据类型和void,必须一致;如果是引用数据类型,重写方法的返回值类型必须和被重写方法的返回值类型相同或是它的子类
权限修饰符无关重写方法的访问权限必须 大于或等于 被重写方法的访问权限
方法调用根据传递的实际参数根据对象的类型
抛出的异常无关重写方法抛出的异常类型要么和被重写方法相同,要么是被重写方法抛出的异常的子类,要么不抛出异常
### Java 方法重载方法重写 #### 区别 方法重载方法重写Java中两种重要的机制,尽管名称相似,但两者有着本质的区别。 - **方法重载**指的是在一个内部可以有多个同名的方法,这些方法通过不同的参数列表来区分。这里所说的参数列表不同是指参数的数量、型或顺序有所差异[^5]。 - **方法重写**则发生在父子之间,当子提供了父已有方法的新版本时即发生重写。这意味着子中的该方法签名(包括访问权限修饰符)需完全匹配父中的相应方法,并且通常情况下子会改变此方法的行为以适应更具体的上下文需求[^4]。 #### 使用场景 对于**方法重载**而言,在不需要创建新的数据结构的情况下增加功能灵活性是非常有用的;例如,一个函数可能接受不同型的数据作为输入并处理它们。这使得API设计更加直观易用,因为开发者可以根据实际需要传递适当型的参数给同一个名字下的不同实现形式[^2]。 而关于**方法重写**,它主要应用于扩展已有的行为模式上——特别是当我们希望特定型的对象能够表现出不同于其超的行为时。比如图形界面组件库可能会定义一些通用的操作接口供所有控件共享,但在具体实例化某个特殊按钮或其他UI元素的时候,则可以通过覆盖默认操作来自定义交互逻辑[^3]。 #### 示例代码 以下是两个概念的具体应用例子: ##### 方法重载示例 ```java public class Calculator { public int add(int a, int b){ return a+b; } public double add(double a,double b){ return a+b; } } ``` 在这个`Calculator`中有两个名为`add`的方法,但由于接收的参数型不同所以编译器能识别这是两个独立的功能。 ##### 方法重写示例 ```java class Animal{ void sound(){ System.out.println("Animal makes sound"); } } class Dog extends Animal{ @Override void sound() { System.out.println("Dog barks"); } } ``` 在此处,`Dog`继承自`Animal`并通过使用`@Override`注解表明正在重新定义从基继承下来的方法`sound()`。因此如果有一个指向`Dog`对象的引用变量调用了这个方法将会打印出“Dog barks”,而不是原始动物的声音描述。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值