一、基本概念
“覆盖”针对“一般方法”而言。
覆盖一般方法须满足以下两个条件:
- 覆盖方法所在类须继承被覆盖方法所在类,覆盖方法所在类须可继承被覆盖方法
- 覆盖方法与被覆盖方法方法声明完全一致或者变种一致
接下来着重介绍“变种一致”的所有情形。
二、变种一致
2.1、修饰符
2.1.1、abstract修饰符
被覆盖方法额外具有“abstract”修饰符。
| 12
 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”修饰符。
| 12
 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;
 }
 }
 
 | 
| 12
 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”修饰符。
| 12
 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、访问权限控制符
覆盖方法的访问权限控制符权限大于被覆盖方法的访问权限控制符。
| 12
 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”修饰符。
| 12
 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();
 }
 
 | 
| 12
 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中添加了协变返回类型,覆盖方法可以返回被覆盖方法返回类型的某种导出类型。
| 12
 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);
 }
 }
 
 |