Java继承调用父类方法:子类无法获取用户输入值问题求助
问题分析与解决方案
嘿,我看你遇到的问题是调用fun2()时总是显示x=0 y=0,这大概率是**成员变量被隐藏(Shadowing)**或者变量没有正确初始化导致的。咱们一步步来捋清楚:
首先,你的代码片段里A类有Scanner,但没看到x、y的定义——如果在B或者C类里重新声明了x、y,那子类的变量会覆盖父类的,而如果这些子类变量没被赋值,就会默认初始化为0。另外,如果fun2()里用的是局部变量而不是继承来的成员变量,也会出现这种情况。
下面是修正后的完整代码,我会给你标注关键改动:
import java.util.Scanner; public class myClass { public static void main(String[] args) { C ccc = new C(); ccc.fun3(); } } class A { Scanner in = new Scanner(System.in); // 在父类A中定义成员变量x、y,子类B、C会继承它们 protected int x; protected int y; // 可以在A中写一个输入方法,子类直接调用 protected void inputValues() { System.out.print("请输入x的值:"); x = in.nextInt(); System.out.print("请输入y的值:"); y = in.nextInt(); } } class B extends A { // 不要在这里重新定义x、y!否则会覆盖父类的变量 public void fun2() { // 直接使用继承自A的x、y成员变量 System.out.println("x=" + x + " y=" + y); } } class C extends B { public void fun3() { // 先调用输入方法给x、y赋值 inputValues(); // 再调用B类的fun2() fun2(); } }
关键要点说明:
- 避免变量隐藏:不要在B或C类中重新声明
x、y,否则子类的变量会覆盖父类的,导致你输入的值存在父类变量里,但fun2()用的是子类未赋值的变量(默认0)。 - 使用继承的成员变量:
protected修饰的变量可以被子类直接访问,所以A中定义的x、y,B和C都能直接用。 - 先赋值再调用方法:在
fun3()里先调用inputValues()完成输入,确保x、y有值后再调用fun2()。
如果你的原代码里fun2()是用了局部变量(比如方法里定义了int x, y;),那一定要改成使用成员变量,否则局部变量没赋值就会显示0。
内容的提问来源于stack exchange,提问作者197mz
相关产品推荐
相关产品推荐

