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

Java子类访问父类变量方法及父类变量值异常问题求助

解决子类重写方法中父类变量值变为0的问题

嘿,刚学Java碰到这种变量值异常的情况太常见了,我来帮你拆解下可能的原因和解决办法!

首先,咱们得先定位问题的核心:你通过Scanner给父类的变量C赋值了,但子类执行逻辑时C却变成了默认的0,这大概率是变量遮蔽、实例操作错误或者赋值时机不对导致的,咱们一个个来排查:

1. 检查子类是否存在变量遮蔽

这是最常见的原因!如果你在子类里又重新定义了一个同名变量C(比如int C;),那子类里直接用C时,会优先访问子类自己的这个变量,而子类的C如果没赋值,默认就是0。

👉 解决办法:删除子类中重复定义的C变量,或者在子类里明确用super.C来访问父类的C,避免混淆。

2. 确认赋值的实例和调用方法的实例是同一个

比如你可能先创建了一个父类对象,给它的C赋值,然后又创建了一个子类对象去调用方法——这两个是不同的实例,子类对象的C自然还是默认0。

👉 解决办法:确保你是给同一个子类对象的C赋值,然后调用该对象的方法。比如:

// 正确操作:同一个子类对象
Child child = new Child();
child.setC(scanner.nextInt()); // 给这个子类对象的父类C赋值
child.yourOverrideMethod(); // 调用重写的方法

3. 检查getter/setter的正确性

虽然你说用了getter和setter,但可能不小心写错了逻辑:

  • 比如setter方法里是不是写成了this.C = 0;而不是this.C = value;?
  • 或者getter方法返回的是别的变量,而不是父类的C?

👉 解决办法:把父类的getter/setter代码拿出来核对,确保逻辑正确:

// 父类正确的getter/setter示例
public int getC() {
    return C; // 确实返回父类的C
}

public void setC(int c) {
    this.C = c; // 确实把参数赋值给父类的C
}

4. 确保赋值操作在调用子类方法之前执行

如果你的代码顺序是先调用了子类的重写方法,再用Scanner给C赋值,那方法执行时C肯定还是0。

👉 解决办法:调整代码顺序,先完成Scanner输入和赋值,再调用子类的方法。

给你一个完整的示例代码参考

// 父类
class Parent {
    protected int C; // 非私有变量

    // 正确的getter和setter
    public int getC() {
        return C;
    }

    public void setC(int c) {
        this.C = c;
    }

    // 父类的方法,子类要重写
    public void calculate() {
        System.out.println("父类的计算逻辑");
    }
}

// 子类
class Child extends Parent {
    // 注意:这里不要重复定义int C;

    @Override
    public void calculate() {
        // 用super.getC()获取父类的C值,或者直接super.C
        int currentC = super.getC();
        if (currentC > 10) {
            System.out.println("C的值大于10");
        } else {
            System.out.println("C的值小于等于10,当前值:" + currentC);
        }
    }

    public static void main(String[] args) {
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        Child child = new Child();
        
        // 先赋值
        System.out.print("请输入C的值:");
        int input = scanner.nextInt();
        child.setC(input);
        
        // 再调用重写的方法
        child.calculate();
        
        scanner.close();
    }
}

按照上面的步骤排查,应该就能解决你的问题啦!

内容的提问来源于stack exchange,提问作者Drasticdreamer Drasticity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:57:00