一、基本概念 “覆盖”针对“一般方法”而言。 覆盖一般方法须满足以下两个条件:
覆盖方法所在类须继承被覆盖方法所在类,覆盖方法所在类须可继承被覆盖方法
覆盖方法与被覆盖方法方法声明完全一致或者变种一致
接下来着重介绍“变种一致”的所有情形。
二、变种一致 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); } }