You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类对象向上转型为父类,为何成员变量与方法访问表现不同?

问题分析: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:14