一旦在类中定义了一个字段,它就必须永远留在那里以保持二进制兼容性
这将是非常令人惊讶的:
Java 语言规范 Java SE 7 版定义了非限定字段访问表达式的二进制名称,如下所示:
给定一个表示类 C 中的字段访问的合法表达式,引用在(可能不同的)类或接口 D 中声明的名为 f 的非常量(第 13.4.9 节)字段,我们定义字段引用的限定类型如下:
- 如果表达式是 Primary.f 的形式,那么:
- 如果 Primary 的编译时类型是交集类型 (§4.9) V1 & ... & Vn,则引用的限定类型是 V1。
- 否则,Primary 的编译时类型是引用的限定类型。
(Java 1.5 的语言规范使用完全相同的措辞)
也就是说,字段访问表达式的二进制名称并不指声明该字段的类型,仅指我们用于访问该字段的主表达式的类型,因此无论该类型的哪个超类声明该字段,编译器都是需要将相同的字段引用发送到类文件中。
的确,当我刚刚尝试从
package p;
public class Super {
}
package p;
public class Sub extends Super {
public String message;
@Override
public String toString() {
return message;
}
}
到
package p;
public class Super {
public String message;
}
package p;
public class Sub extends Super {
@Override
public String toString() {
return message;
}
}
无需重新编译
package p;
public class Main {
public static void main(String[] args) {
Sub sub = new Sub();
sub.message = "hello";
System.out.println(sub);
System.out.println(sub.message);
}
}
我仍然收到了输出
hello
hello
, 不是LinkageError
.
总而言之,这种说法对于 Java 7 是不正确的。对于 JDK 1.4 或更早版本可能是正确的,它在 5 年多前被宣布终止生命周期。无论哪种方式,也许您应该使用更好/更新的书?