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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:07