Java中的字段没有多态性。但是,有继承。有效完成的工作是在Rectangle类中创建两个名称相同的字段。该字段的名称实际上是:
public class Rectangle { public int Shape.x; public int Rectangle.x;}上面的代码并不代表有效的Java,它只是说明如何在类中定义字段的范围
在Rectangle类的整个范围内,同名的超类字段被 隐藏
。因此,无论何时在类中引用简单名称
x或范围名称
this.x,都将引用中定义的字段
Rectangle。实际上,您还可以使用作用域名称来访问超类字段
super.x。
现在,从类外部,正在访问其字段的规则略有不同。范围将由引用该字段的类的 编译 时间类型确定。因此,在您的代码中:
Shape s = new Shape();Rectangle r = new Rectangle();s = r;System.out.println(s.x);
输出是
0因为的编译时间类型
s为
Shape(not
Rectangle)。当您这样做时,您可以观察到此行为的变化:
Shape s = new Shape();Rectangle r = new Rectangle();s = r;System.out.println(((Rectangle)s).x);
快点!现在的输出是
1,因为编译器看到您已将域访问范围限定为
Rectangle。
浓缩可见性规则:
您可以在JLS的8.3.3.2节中阅读有关隐藏实例变量的更多信息。


![具有实例变量的多态[重复] 具有实例变量的多态[重复]](http://www.mshxw.com/aiimages/31/595292.png)
