关于 java 域和静态方法不支持多态导致的缺陷

# 问题描述

在 java 编程思想里有这么一句话:

1

例如代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A1{
int field = 5;
static void print1(){
System.out.println(1);
}
protected int getfield(){return field;}
}
class A2 extends A1{
int field = 1;
static void print2(){
System.out.println(1);
}
@Override
public int getfield(){return field;}
}
public class PolymorphismDrawbacks {
public static void main(String[] args){
A1 a2 = new A2();
System.out.printf("%d,%d\n",a2.field,a2.getfield());
}
}

对应输出结果为

1
5,1

虽然类 A2 对 field 有重载的初始化,但是由于 “域不支持多态”,使对域的访问在编译期间已经完成而不是执行期间。故在访问 a2 域时其仍为 A1 类,而重载初始化并未进行。这样很容易和我的理解出现偏差导致逻辑错误

# 解决方案

把所有域设置为 private (高度封装不可继承)

然后如要访问则写一个方法 getValue () 去访问域即可