Par*_*val 21 java oop inheritance
考虑下面的代码
class A
{
int x = 5;
void foo()
{
System.out.println(this.x);
}
}
class B extends A
{
int x = 6;
// some extra stuff
}
class C
{
public static void main(String args[])
{
B b = new B();
System.out.println(b.x);
System.out.println(((A)b).x);
b.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
该计划的输出是
6
5
5
Run Code Online (Sandbox Code Playgroud)
我理解前两个但是无法理解最后一个.b.foo()如何打印5.B类将继承foo方法.但它不应该打印bx会打印什么?到底发生了什么?
rge*_*man 18
是的,B该类继承了该foo方法.但是变量x中B隐藏x在A; 它不会取代它.
这是一个范围问题.该foo方法A仅查看范围内的变量.在范围上唯一的变量是实例变量x中A.
该foo方法是继承的,但未被覆盖B.如果您foo使用相同的确切代码显式覆盖:
class B extends A
{
int x = 6;
@Override
void foo()
{
System.out.println(this.x);
}
}
Run Code Online (Sandbox Code Playgroud)
那么当引用时将在范围内的变量this.x将是B's x,并且6将被打印.虽然方法的文本是相同的,但由于范围的原因,引用是不同的.
顺便说一句,如果你真的想是指A的x在B类中,你可以使用super.x.