Java中的重载(overload)与重写(override)是Java面向对象编程特别是多态中比较重要的概念,两者的比较也是笔试中经常遇到的问题,现在举几个例子,对这两者稍加探索。
重载不多说,要求重载的方法有相同的方法名,但是参数不一样(数量,类型,顺序),注意返回值类型不算,因为返回值类型是函数执行完之后才能确定的,如果有两个方法除返回值类型不同其它全相同,Java虚拟机会认为这是同一个方法,并报错:
public class OverloadTest {
public static double fun(int a, int b) {
return a + b;
}
public static int fun(int a, int b) {
return a + b;
}
public static void main(String[] args) {
}
}
重写要求就比较严格,需要类之间有继承关系,还要求方法有相同的签名和返回值类型:
public class OverrideAndOverloadTest1 {
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 {
//This method overrides the method in B
public void p(double i) {
System.out.println(i);
}
}
运行结果:
可以看到因为重写(覆盖)的关系只会调用类A中的p方法,可以在注释下面加上@Override标记。
下面看看对应的一个例子:
public class OverrideAndOverloadTest2 {
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 {
// This method overloads the method in B
public void p(int i) {
System.out.println(i);
}
}
运行结果:
这里因为是改变了参数的类型而产生了父类子类间的方法重载,参数是10就调用子类参数类型是整型的方法,是10.0就调用父类参数类型是双精度浮点型的p方法。如果在注释处强行添加@Override就会报错!
小结:
①方法重写发生在通过继承而相关的不同类中;方法重载可以发生在同一个类中,也可以发生在由于继承而相关的不同类中。
②方法重写具有同样的签名和返回值类型;方法重载具有同样的名字,不同的参数列表,不管返回值!