向上转换时,Java如何处理字段?
可能重复:向上转换时,Java如何处理字段?,java,Java,可能重复: 我对Java在升级过程中如何处理类的字段感到困惑。例如: class SuperClass { String myString = "String in SuperClass"; public void myMethod() { System.out.println("Method in SuperClass"); } } class SubClass extends SuperClass { String myStrin
我对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
时,它是子类
类的一个实例;但是,我告诉编译器将其视为超类
。关于方法工作的一切对我来说都很清楚:如果为超类
定义了给定的方法,我将只能使用子类
的方法
但是,当我试图访问test
的myString
时,我不明白为什么要使用超类的字段。既然test
是SubClass
的一个实例,我希望使用SubClass
中定义的myString
,为什么不这样呢?我错过了什么
我知道我可以使用这个
操作符访问子类
的myString。例如,我可以在超类中定义printMyString
方法,并用
public void printMyString()
{
System.out.println(this.myString);
}
在子类
中,我的问题主要是关于超类
字段如何用于测试
。也许我遗漏了一些明显的东西
我试着寻找答案,我找到的最接近的话题虽然有用,但并没有回答我的问题
提前感谢属性不能像方法那样重载
test.myMethod();
这里,方法调用取决于实际对象的类型。这里的对象类型为SubClass
,因此调用SubClass
的方法
test.myString
访问属性时,它取决于引用变量的类型。这里引用变量ietest
属于SuperClass
类型,因此可以访问SuperClass
中的属性
你看的是 Java中的字段是隐藏的,实际上没有被覆盖(这并不意味着我们在尝试此操作时会出现编译时错误,相反,它们没有被真正意义上的覆盖)
重写意味着应该根据运行时调用成员
对象的类型,而不是基于声明的类型
但Java中字段的绑定始终是静态的,因此它只基于声明的对象引用类型
在您给出的示例中,通过在class子类
中声明名为“myString”的类变量,可以隐藏它从其父类父类
继承的名为“myString”的类变量
Java语言规范:
如果类声明具有特定名称的字段,则
该字段的声明据说隐藏了所有可访问的内容
超类中同名字段的声明,以及
班上的高级介面
隐藏字段可以通过使用限定名(如果是静态的)来访问,或者通过使用包含关键字super的字段访问表达式或转换为超类类型来访问
很好的链接,谢谢。关键部分是:“当子类中的实例变量与超类中的实例变量同名时,则在引用类型的类中选择该实例变量。”@Akavall:Ya你说到点子上了:)