变量遮蔽问题(Variable Shadowing)

定义的Person类

public abstract class Person {
      String name;
      int age;
      String sex;

      public Person(String name, int age, String sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
      }

定义的Person类的子类Worker

public class Worker extends Person{
    String name;
    int age;
    String sex;

    public Worker(String name, int age, String sex) {
        super(name, age, sex);
    }

    public void showname(){
        System.out.println(this.name);
    }
}

在主函数中创建一个Worker类的对象,输入参数之后,输出为null而不是正确的参数 

 下面是求助chatgpt的回答:

当你调用 w.showname() 方法时,它输出 null 的原因是你的 Worker 类中存在变量遮蔽问题(Variable Shadowing)。在 Worker 类中,你重新声明了 name 字段,这个字段会遮蔽从 Person 类继承的 name 字段,导致 Person 类中的 name 字段没有被正确初始化,因此默认为 null

为了解决这个问题,你应该去掉在 Worker 类中的重复字段声明,同时在 Worker 类的构造函数中使用 super(name, age, sex) 来初始化从 Person 类继承的 name 字段,如下所示:

 

使用注释符删去重复定义的name后,发现确实可以正常输出了 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值