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

方法重载和方法重写在英文中分别是overload和override,很多人在学习Java的过程中总是分不清重写和重载这两个方法,实际上,这两个方法还是有很大的差别的,重载和重写这两个方法虽然名字有些类似,但他们之间有很少的联系,除了二者都是发生在方法之间,并要求方法名相同之外,没有太大的相似之处。重载主要发生在同一个类的多个重名方法之间,重写则发生在子类和父类同名方法之间,当然父类方法和子类方法之间也可以发生重载,因为子类会获得父类的方法,如果子类定义了一个与父类方法有相同的方法名,但参数列表不同的方法,就会形成父类方法和子类方法的重载。
方法重载要遵循的原则:两同一不同
(1)两同:同一个类中的方法名相同
(2)一不同:参数列表(个数或类型)不同
至于方法中的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。

方法重写要遵循的原则:两同两小一大
(1)两同:方法名相同、形参列表相同
(2)两小:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等
(3)一大:是子类方法的访问权限应比父类方法的访问权限更大或相等

### 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”,而不是原始动物的声音描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值