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
相关产品推荐
相关产品推荐

