一篇文章带你彻底搞懂方法重写(override)和重载(overload)
这个其实我们在之前的java方法那一章节里面就提到了,这里更加深入一下,并且提供具体的例子。
重写(Override)基本概念:
Java方法**重写(Override)**指的是,子类对父类的允许访问的方法(非private修饰的)的实现过程进行重新编写, 返回值和形参都不能改变。相同的方法名,相同的形参,相同的返回值,但是方法体的内容不同,即”外壳不变,核心重写“。
重写的好处:
可以根据子类需要,定义特定于子类自己的行为。 也就是说子类能够根据需要实现父类的方法。简单打个比方,父类:动物,嘎嘎叫方法。子类:狗,嘎嘎叫方法(输出:汪汪汪)
需要注意的点有:
**重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。**例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常。
在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:
package main.method方法;
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void mark(){
System.out.println("狗狗撒尿作为领地占有的标志");
}
}
public class Test{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象 向下转型
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
//b.mark();//这样会报错,因为b的引用类型Animal没有mark(),除非你在Animal中编写一个mark()方法,又或者说进行一个强制类型转换,把Animal类型的b转换为含有mark()方法的Dog类型即(Dog) b。
((Dog)b).mark();//调用子类Dog独有的方法之前要进行强制类型转换,即(Dog) b。
}
}
以上实例编译运行结果如下:
动物可以移动
狗可以跑和走
狗狗撒尿作为领地占有的标志
方法的重写规则
- 参数列表与被重写方法的参数列表必须完全相同。
- **返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(“java5 及更早版本返回类型要一样,java7 及更高版本可以不同”)。**简单举例:父类Animal的mark方法返回的是Animal对象,而子类Dog的mark方法可以返回的是Dog对象。”子类方法返回 Dog 类型,是 Animal 的子类型“
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
- 父类的成员方法只能被它的子类重写。
- 声明为 final 的方法不能被重写。
- 声明为 static 的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。(即默认访问修饰符default、public公共的、protected受保护的)
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。(没有被显示指定访问修饰符的”dafault的方法,在不同包的子类中无法被重写“)
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个类,则不能重写该类的方法。
小结:重写(Override)体现的是父类和子类之间多态的一种表现
Super 关键字的使用
当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
重载(Overlode)基本概念:
方法重载(Method Overloading)是指在”同一个类“中定义多个名称相同但参数列表不同的方法。
方法重载的特点如下:
- 方法名称必须相同。
- 方法的参数列表必须不同,要么是参数的类型不同,要么是参数的数量不同,要么是参数的顺序不同。
- 方法的返回类型可以相同也可以不同。
- 方法重载与方法的访问修饰符、异常类型等无关。
通过方法重载,我们可以使用相同的方法名称来实现不同的行为,方便了代码的复用和可读性。
以下是一个方法重载的示例:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}
在上面的例子中,Calculator
类定义了三个名为 add
的方法,它们的参数列表分别为 (int, int)
、(int, int, int)
和 (double, double)
。这样,我们可以根据需要使用不同的参数调用适合的 add
方法。
例如:
Calculator cal = new Calculator();
int result1 = cal.add(2, 3); // 调用 add(int, int) 方法
int result2 = cal.add(2, 3, 4); // 调用 add(int, int, int) 方法
double result3 = cal.add(2.5, 3.7); // 调用 add(double, double) 方法
通过方法重载,我们可以为同一方法名称提供多种不同参数的实现,以便于适应实际开发中我们遇到的各种不同的使用情况和需求。
重载是一个类的多态性具体表现形式
重写与重载之间的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
总结
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
- 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
- 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
- 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
结尾语:记录于2023年8月2号0时46分,以上仅为个人在[Java Override和Overload](Java 重写(Override)与重载(Overload) | 菜鸟教程 (runoob.com))的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,希望对您有帮助,感谢观看!如果可以的话,点点赞,点点关注