一、基本概念
“覆盖”针对“一般方法”而言。
覆盖一般方法须满足以下两个条件:
- 覆盖方法所在类须继承被覆盖方法所在类,覆盖方法所在类须可继承被覆盖方法
- 覆盖方法与被覆盖方法方法声明完全一致或者变种一致
接下来着重介绍“变种一致”的所有情形。
二、变种一致
2.1、修饰符
2.1.1、abstract修饰符
被覆盖方法额外具有“abstract”修饰符。
package chapter8;
abstract class Parent {
abstract int f();
}
public class Child extends Parent {
int f() {
return 10;
}
}
2.1.2、synchronized修饰符
被覆盖方法或者覆盖方法额外具有“synchronized”修饰符。
package chapter8;
class Parent {
synchronized int f() {
return 20;
}
}
public class Child extends Parent {
int f() {
return 10;
}
}
package chapter8;
class Parent {
int f() {
return 20;
}
}
public class Child extends Parent {
synchronized int f() {
return 10;
}
}
2.1.3、final修饰符
覆盖方法额外具有“final”修饰符。
package chapter8;
class Parent {
int f() {
return 20;
}
}
public class Child extends Parent {
final int f() {
return 10;
}
}
2.1.4、访问权限控制符
覆盖方法的访问权限控制符权限大于被覆盖方法的访问权限控制符。
package chapter8;
class Parent {
int f() {
return 20;
}
}
public class Child extends Parent {
public int f() {
return 10;
}
}
2.1.5、native修饰符
被覆盖方法或者覆盖方法额外具有“native”修饰符。
package chapter8;
class Parent {
int f() {
return 20;
}
}
public class Child extends Parent {
native int f();
}
package chapter8;
class Parent {
native int f();
}
public class Child extends Parent {
int f() {
return 20;
}
}
2.2、返回结果
Java SE5中添加了协变返回类型,覆盖方法可以返回被覆盖方法返回类型的某种导出类型。
package chapter8;
class Grain {
public String toString() {
return "Grain";
}
}
class Wheat extends Grain {
public String toString() {
return "Wheat";
}
}
class Mill {
Grain process() {
return new Grain();
}
}
class WheatMill extends Mill {
Wheat process() {
return new Wheat();
}
}
public class CovariantReturn {
public static void main(String[] args) {
Mill m = new Mill();
Grain g = m.process();
System.out.println(g);
m = new WheatMill();
g = m.process();
System.out.println(g);
}
}