可能重复:
The concept of shadowing
我很担心在上传期间如何在Java中处理类的字段。例如:
class SuperClass
{
String myString = "String in SuperClass";
public void myMethod()
{
System.out.println("Method in SuperClass");
}
}
class SubClass extends SuperClass
{
String myString = "String in SubClass";
public void myMethod()
{
System.out.println("Method in SubClass");
}
}
class Question
{
public static void main(String[] args)
{
SuperClass test = new SubClass();
// object test is an instance of SubClass
// but I am telling the compiler to treat it as SuperClass
test.myMethod();
System.out.println(test.myString);
}
}
输出:
Method in SubClass
String in SuperClass //Why is "String in SubClass" not used?
当我创建一个对象test
时,它是SubClass
类的一个实例;但是,我告诉编译器将其视为SuperClass
。关于方法的工作,一切都很清楚:如果为SubClass
定义了给定的方法,我将只能使用SuperClass
的方法。
但是,当我尝试访问SuperClass
myString
时,我迷失了test
字段的原因。由于test
是SubClass
的实例,我希望myString
中定义的SubClass
被使用,为什么不会发生这种情况?我错过了什么?
我知道我可以使用SubClass
运算符访问this
的myString。例如,我可以在SuperClass中定义printMyString
方法,并用
public void printMyString()
{
System.out.println(this.myString);
}
在SubClass
中,我的问题主要是SuperClass
如何使用test
的字段。也许我错过了一些明显的东西?
我试图搜索答案,我找到的最接近的主题是Upcasting in Java and two separate object properties,虽然有帮助,却没有回答我的问题。
提前感谢
答案 0 :(得分:7)
属性不能像方法那样重载。
test.myMethod();
此处方法调用取决于实际对象的类型。此处对象的类型为SubClass
,因此调用SubClass
的方法。
test.myString
访问属性时,它取决于类型的引用变量。这里引用变量ie test
的类型为SuperClass
,因此访问SuperClass
的属性。
答案 1 :(得分:3)
Java中的字段仅隐藏且实际上未被覆盖(这并不意味着我们在尝试此操作时会遇到编译时错误,而是在真正意义上不会覆盖它们)。
覆盖意味着应该根据运行时调用该成员 对象的类型而不是基于声明的类型。
但Java中字段的绑定始终是静态的,因此它仅基于声明的对象引用类型。
在您给出的示例中,通过在类SubClass
中声明名为“myString”的类变量,您可以隐藏它将从其超类SuperClass
继承的类变量,并使用相同的名称'的myString'。
Java语言规范:
如果类声明了具有特定名称的字段,那么 据说该领域的声明隐藏任何和所有可访问的 超类中具有相同名称的字段的声明,和 班级的超级接口。
如果隐藏字段是静态的,则可以使用限定名称,或者使用包含关键字super或强制转换为超类类型的字段访问表达式来访问隐藏字段。