Java (字段隐藏)何时同时使用子类字段及其隐藏的超类字段有意义?

Java (字段隐藏)何时同时使用子类字段及其隐藏的超类字段有意义?,java,member-hiding,Java,Member Hiding,在Java中(与大多数OO语言一样),可以有两个类,一个扩展另一个。两个类中都可以有同名的实例字段,其中子类的“实例字段”隐藏了超类的“实例字段”。下面是一个例子 class A{ int i; } class B extends A{ int i; } 这意味着在创建对象时,它既有其B实例字段i,也有其A实例字段i。有人可能会认为你永远不会想要这个,当你在B类中概念性地创建一个新的“i”时,它意味着“唯一一个与这个对象相关的i”。什么时候不是这样?举两个类的例子,我们希望保

在Java中(与大多数OO语言一样),可以有两个类,一个扩展另一个。两个类中都可以有同名的实例字段,其中子类的“实例字段”隐藏了超类的“实例字段”。下面是一个例子

class A{
    int i;
}

class B extends A{
    int i;
}

这意味着在创建对象时,它既有其B实例字段i,也有其A实例字段i。有人可能会认为你永远不会想要这个,当你在B类中概念性地创建一个新的“i”时,它意味着“唯一一个与这个对象相关的i”。什么时候不是这样?举两个类的例子,我们希望保留并修改这两个实例变量。

它不能同时拥有这两个实例变量,因为它们都被称为
i
。如果一个是
i
,另一个是
j
,则是。现在它正在覆盖它。@宪兵这是众所周知的,完全有效的。你不能覆盖字段。@Gendarme你说过不能同时覆盖两个字段。这是不正确的。上面的代码可以很好地编译。重写意味着运行时将根据接收方表达式的运行时类型解析成员。对于字段,情况并非如此。字段不是多态的。@Gendarme这不是重点。看见方法是多态的。在运行时,它们根据表达式的运行时类型进行解析。字段在编译时解析为表达式的静态类型。它们不是多态的。覆盖不适用于它们。正确的术语是隐藏的,这是一个完全不同的概念。将
a
声明为
B
变量,您将看到不同的行为。@Gendarme它的变体。例如,C#将强制您对此类成员声明使用
new
关键字,以避免使用同名的意外字段。请参阅(尝试删除字段声明中的
)。