中文翻译分别是覆盖,重载和重写
Override 和 Overwrite
实际上覆盖(Override)和重写(Overwrite)是对同一概念的不同称呼。
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写
Java中,需要重写(覆盖)父类中的方法,或者实现接口中的方法,可以用@Override
标注这是一个此方法重写了(覆盖)父类/接口中的方法。
Overload
重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数,具体解释见下面代码。
示例代码
/**
* @author jimyoung
*/
class A {
char i = 'a';
public void fun(int a) {
System.out.println("调用A.fun(int a)");
}
public void fun(int a, int b) {
System.out.println("调用A.fun(int a, int b)");
}
}
class B extends A {
char i = 'b';
/**
* 此方法是A.fun(int a, int b)的一个重写/覆盖(Override/Overwrite)
*/
@Override
public void fun(int a, int b) {
System.out.println("调用B.fun(int a, int b)");
}
/**
* 此方法是B.fun(int a, int b)的一个重载(Overload)
* 重载要求方法名相同,参数不同(包括参数个数,参数类型,参数顺序,任一不同即可)
* void fun(double i, int j) 和 void fun(int j, double i)也构成重载关系
* 重载对返回结果不作要求,因为无法在调用的时候通过返回结果来明确调用的是哪个函数
*/
public void fun(int a, int b, int c) {
System.out.println("调用B.fun(int a, int b, int c)");
}
public static void main(String[] args) {
A a = new B();
B b = new B();
b.fun(1);
b.fun(1, 1);
b.fun(1, 1, 1);
a.fun(1);
a.fun(1, 1);
/**
* 子类不能覆盖父类的属性
*/
System.out.println(a.i);
System.out.println(b.i);
/**
* 无法进行下方这样的调用,因为父类引用不能访问子类中独有的方法
* 如果子类对父类方法进行了重写,那么访问的是子类中的方法,参考a.fun(1, 1);的执行结果(多态的体现)
*/
//a.fun(1, 1, 1);
}
}
输出结果
调用A.fun(int a)
调用B.fun(int a, int b)
调用B.fun(int a, int b, int c)
调用A.fun(int a)
调用B.fun(int a, int b)
a
b