类层次结构中,如果子类中的一个方法与它超类中的方法有相同的方法名和类型声明,称子类中的方法重载(override)超类中的方法。从子类中调用重载方法时,它总是引用子类定义的方法。而超类中定义的方法将被隐藏。考虑下面程序:
// Method overriding.
class A {
int i, j;
A(int a, int b) {
i = a;
j = b;
}
// display i and j
void show() {
System.out.println("i and j: " + i + " " + j);
}
}
class B extends A {
int k;
B(int a, int b, int c) {
super(a, b);
k = c;
}
// display k – this overrides show() in A
void show() {
System.out.println("k: " + k);
}
}
class Override {
public static void main(String args[]) {
B subOb = new B(1, 2, 3);
subOb.show(); // this calls show() in B
}
}
程序输出如下:
k: 3
当一个B类的对象调用show( )时,调用的是在B中定义的show( )版本。也就是说,B中 的show( )方法重载了A中声明的show( )方法。
如果你希望访问被重载的超类的方法,可以用super。例如,在下面的B的版本中,在子类中超类的show( )方法被调用。这使所有的实例变量被显示。
class B extends A {
int k;
B(int a, int b, int c) {
super(a, b);
k = c;
}
void show() {
super.show(); // this calls A's show()
System.out.println("k: " + k);
}
}
如果你用该版本的A代替先前的版本形式,将会得出下面输出:
i and j: 1 2
k: 3
这里,super.show( )调用了超类的show( )方法。
方法覆盖仅在两个方法的名称和类型声明都相同时才发生。如果它们不同,那么两个方法就只是重载。例如,考虑下面的程序,它修改了前面的例子:
// Methods with differing type signatures are overloaded – not
// overridden.
class A {
int i, j;
A(int a, int b) {
i = a;
j = b;
}
// display i and j
void show() {
System.out.println("i and j: " + i + " " + j);
}
}
// Create a subclass by extending class A.
class B extends A {
int k;
B(int a, int b, int c) {
super(a, b);
k = c;
}
// overload show()
void show(String msg) {
System.out.println(msg + k);
}
}
class Override {
public static void main(String args[]) {
B subOb = new B(1, 2, 3);
subOb.show("This is k: "); // this calls show() in B
subOb.show(); // this calls show() in A
}
}
该程序的输出显示如下:
This is k: 3
i and j: 1 2
B中show( )带有一个字符串参数。这是它的类型标签与A中的不同,A中的show( )没有带参数。因此没有覆盖(或名称隐藏)发生。