方法重载vs方法重写

重写

重写是什么意思?有什么规则?
顾名思义就是把方法重新写一遍,什么时候写呢?子类继承父类方法时写。

1.发生在父类与子类之间
2.方法名,参数列表,返回类型,必须相同。简称同名同参
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(关于访问限定符的具体细节,另一篇博客有些。)
4非检查异常:重写方法可以抛出任何非检查的异常,无论被重写方法是否查明了该异常
5、检查异常:重写方法一定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常
6、不能重写标志为final、static的方法

重载

重载 总结:
1、参数列表:被重载的方法必须改变参数列表
2、返回类型:可以改变返回类型
3、修饰符:可以改变修饰符
4、异常:可以声明新的或者更广泛的异常
5、重载Overload是一个类中多态性的一种表现
6、重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准

说了这么多,那面试官要是真问起来,我们该怎么回答呢?

重载是一个类,多个方法的方法名相同但是参数不同(与返回类型,修饰符无关)。重写是在子类和父类之间,子类的返回类型、方法名、参数、修饰符都与父类的方法一致,在继承的情况下才能谈重写。而重载是可以在任何环境下都可以使用的。两者都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

### 方法重载方法重写的定义 #### 方法重载(Overloading) 方法重载指的是在同一个类中,可以有多个同名的方法,但这些方法的参数列表必须不同。参数列表的不同可以体现在参数的数量、类型或顺序上。例如,在Java中,可以通过以下方式实现方法重载: ```java public class OverloadExample { public void display(int a) { System.out.println("Displaying integer: " + a); } public void display(double a) { System.out.println("Displaying double: " + a); } public void display(String a) { System.out.println("Displaying string: " + a); } } ``` 在C++中,函数重载同样是一个重要的特性,编译器会根据调用时提供的参数类型来决定使用哪个版本的函数[^2]。 #### 方法重写(Overriding) 方法重写是指子类重新定义父类的方法重写方法必须具有相同的名称、参数列表和返回类型。通过重写,子类可以根据自己的需求提供不同的实现。例如,在Java中,可以通过以下方式实现方法重写: ```java public class Animal { public void makeSound() { System.out.println("Animal sound"); } } public class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark"); } } ``` 在运行时,JVM会根据对象的实际Class类型来决定实际调用哪个重写方法,而不是引用该对象的变量的Class类型[^1]。 ### 方法重载方法重写的区别 #### 编译时 vs 运行时 - **方法重载**:在编译时确定调用哪个方法。Java编译器会根据引用该对象的变量的Class类型来决定调用哪个重载方法[^3]。 - **方法重写**:在运行时确定调用哪个方法。JVM会根据对象的实际Class类型来决定实际调用哪个重写方法[^1]。 #### 多态性 - **方法重载**:虽然严格来说重载是编译时多态,但在Java中提到的多态通常指的是动态多态,因此重载并不被视为多态[^3]。 - **方法重写**:是面向对象语言多态性的核心机制之一,依赖于重写机制。 #### 作用范围 - **方法重载**:在同一类中,或者在子类中对父类的方法进行重载。 - **方法重写**:在子类中对父类的方法进行重写。 ### 实现原理 #### 方法重载的实现原理 在编译阶段,编译器会根据方法的参数类型和数量来选择合适的方法。这个过程称为重载解析。例如,在C++中,编译器会根据调用时提供的参数类型来决定使用哪个版本的函数。 #### 方法重写的实现原理 在运行时,JVM会根据对象的实际Class类型来决定实际调用哪个重写方法。这是通过虚方法表(Virtual Method Table)来实现的。每个类都有一个虚方法表,其中包含了所有可被重写方法的地址。当调用一个重写方法时,JVM会查找对象的实际Class类型的虚方法表,并调用相应的方法。 ### 示例代码 #### Java中的方法重载示例 ```java public class OverloadExample { public void display(int a) { System.out.println("Displaying integer: " + a); } public void display(double a) { System.out.println("Displaying double: " + a); } public void display(String a) { System.out.println("Displaying string: " + a); } public static void main(String[] args) { OverloadExample example = new OverloadExample(); example.display(10); // Displaying integer: 10 example.display(10.5); // Displaying double: 10.5 example.display("Hello"); // Displaying string: Hello } } ``` #### Java中的方法重写示例 ```java public class Animal { public void makeSound() { System.out.println("Animal sound"); } } public class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark"); } public static void main(String[] args) { Animal myDog = new Dog(); myDog.makeSound(); // Bark } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值