子类对象向上转型为父类,为何成员变量与方法访问表现不同?
问题分析:Java子类成员变量为何输出父类的值
首先看示例代码:
class HelloWorld { public static void main(String[] args) { A a = new B(); System.out.println(a.getX()); a.show(); } } class A { int x = 10; public A() { } public int getX() { return x; } public void show(){ System.out.println("A show"); } } class B extends A{ int x = 20 ; public B() { super(); } @Override public void show(){ System.out.println("B show"); } }
代码运行输出:
10
B show
你对B show的理解完全正确——方法重写是Java多态的关键,当父类引用指向子类对象时,实际调用的是子类重写后的方法。但成员变量和方法的处理逻辑不一样,这就是为什么x输出10:
- Java里成员变量没有重写机制,只有隐藏。子类B中定义的
int x = 20并不是覆盖父类A的x,而是在子类自己的空间里新建了一个同名变量,把父类的x给"藏"起来了。 - 你调用的
getX()是父类A的方法,这个方法里的return x指向的是父类自己的成员变量x(值为10)。父类的方法无法访问子类中隐藏的同名变量,除非子类显式用super.x调用,但这里getX()属于父类,自然只会取父类的x。
如果想让x输出20,最简单的办法是在子类B中重写getX()方法:
@Override public int getX() { return x; // 这里的x就是子类B的变量,值为20 }
内容的提问来源于stack exchange,提问作者Akanksha Makkar
相关产品推荐
相关产品推荐

