在 Java 中,重写(Overriding)和重载(Overloading)是两个与方法有关的概念,它们有不同的含义和用法。
- 重写(Overriding): 重写指的是在子类中定义一个与父类中具有相同方法签名(方法名、参数列表和返回类型都相同)的方法,并且该方法覆盖了父类中的方法。重写允许子类提供自己的实现,从而替换掉父类的默认行为。当通过父类引用调用被重写的方法时,实际上会执行子类中的方法。
重写的特点:
- 方法名、参数列表和返回类型必须与父类方法相同。
- 访问权限可以扩大,但不能缩小。也就是说,子类中重写的方法可以是公共(public)访问权限,而父类中的方法是受保护(protected)访问权限,但不能反过来。
- 子类方法不能抛出比父类方法更多的异常(受检查异常)。子类方法可以抛出与父类方法相同的异常或不抛出异常。
package test;
public class test {
public static void main(String[] args) {
A a = new A();
a.p(10);
a.p(10.0);
}
}
class B{
public void p(double i) {
System.out.println(i*2);
}
}
class A extends B {
public void p(double i) {
System.out.println(i);
}
}
我们来看看代码运行的结果:
运行 a 中的Test类时候,a.p(10) 和 a.p(10.0) 调用的都是定义在类A 中的 p (double i )方法,所以运行的结果都是 10.0
2.重载(Overloading): 重载指的是在同一个类中,可以定义多个方法,它们具有相同的名称,但参数列表不同(个数、类型或顺序)。重载允许在一个类中根据不同的输入来执行不同的操作,方法的返回类型可以相同也可以不同,但方法名和参数列表必须不同。
重载的特点:
- 方法名相同,但参数列表必须不同。
- 返回类型可以不同,但不能仅根据返回类型进行重载。
- 重载与方法的访问权限、抛出的异常无关,只与方法名和参数列表有关。
我们来看看代码:
package test;
public class test {
public static void main(String[] args) {
A a = new A();
a.p(10);
a.p(10.0);
}
}
class B{
public void p(double i) {
System.out.println(i*2);
}
}
class A extends B {
public void p(int i) {
System.out.println(i);
}
}
看看运行结果:
这个代码里面,a.p( 10 ) 调用 类 A中定义的 p( int i ) 方法, 显示输出为 10 , 而 a.p( 10.0 )调用的是定义在类 B中的p(double i )方法, 显示输出为 20.0