一、基本概念
“覆盖”针对“一般方法”而言。
覆盖一般方法须满足以下两个条件:
- 覆盖方法所在类须继承被覆盖方法所在类,覆盖方法所在类须可继承被覆盖方法
- 覆盖方法与被覆盖方法方法声明完全一致或者变种一致
接下来着重介绍“变种一致”的所有情形。
二、变种一致
2.1、修饰符
2.1.1、abstract修饰符
被覆盖方法额外具有“abstract”修饰符。
1 2 3 4 5 6 7 8 9 10 11 12 13
| package chapter8;
abstract class Parent {
abstract int f(); }
public class Child extends Parent {
int f() { return 10; } }
|
2.1.2、synchronized修饰符
被覆盖方法或者覆盖方法额外具有“synchronized”修饰符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package chapter8;
class Parent {
synchronized int f() { return 20; } }
public class Child extends Parent {
int f() { return 10; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package chapter8;
class Parent {
int f() { return 20; } }
public class Child extends Parent {
synchronized int f() { return 10; } }
|
2.1.3、final修饰符
覆盖方法额外具有“final”修饰符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package chapter8;
class Parent {
int f() { return 20; } }
public class Child extends Parent {
final int f() { return 10; } }
|
2.1.4、访问权限控制符
覆盖方法的访问权限控制符权限大于被覆盖方法的访问权限控制符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package chapter8;
class Parent {
int f() { return 20; } }
public class Child extends Parent {
public int f() { return 10; } }
|
2.1.5、native修饰符
被覆盖方法或者覆盖方法额外具有“native”修饰符。
1 2 3 4 5 6 7 8 9 10 11 12 13
| package chapter8;
class Parent {
int f() { return 20; } }
public class Child extends Parent {
native int f(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| package chapter8;
class Parent {
native int f(); }
public class Child extends Parent {
int f() { return 20; } }
|
2.2、返回结果
Java SE5中添加了协变返回类型,覆盖方法可以返回被覆盖方法返回类型的某种导出类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| 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); } }
|