0%

一般方法覆盖

一、基本概念

“覆盖”针对“一般方法”而言。
覆盖一般方法须满足以下两个条件:

  • 覆盖方法所在类须继承被覆盖方法所在类,覆盖方法所在类须可继承被覆盖方法
  • 覆盖方法与被覆盖方法方法声明完全一致或者变种一致

接下来着重介绍“变种一致”的所有情形。

二、变种一致

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);
}
}
您的支持将鼓励我继续分享!