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

Java代码firstName打印为null原因及静态/非静态方法调用成员变量说明

代码打印firstName为null的原因

你提供的代码核心问题出在静态getFirstName()方法的实现逻辑:

  • main方法中创建的pps实例调用setFirstName("Surendra"),仅修改了当前这个实例的firstName属性
  • 静态getFirstName()方法内部重新new Person()创建了一个全新的Person实例,这个新实例的firstName没有经过赋值,Java中引用类型成员变量的默认值就是null,该新实例和main方法中赋值的实例完全独立,没有任何关联,因此最终返回打印的是新实例的默认值。
非静态成员变量的正确调用规则

firstName是非静态成员变量,属于类的具体实例,必须依托实例对象才能访问,不能直接通过类名访问。

1. 静态方法中调用非静态成员变量

静态方法不属于任何类实例,因此必须手动指定要访问的目标实例,有两种常见实现方案:

  • 方案1:将需要访问的实例作为参数传入静态方法
    示例代码:
    public class Person {
        String firstName;
    
        public static void main(String[] args) {
            Person pps = new Person();
            pps.setFirstName("Surendra");
            // 调用静态方法时传入已赋值的实例
            System.out.println(getFirstName(pps));
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        // 静态get方法接收实例参数,访问指定实例的属性
        public static String getFirstName(Person p) {
            return p.firstName;
        }
    }
    
  • 方案2:将对应的get方法改为非静态方法,调用时依托实例访问
    示例代码:
    public class Person {
        String firstName;
    
        public static void main(String[] args) {
            Person pps = new Person();
            pps.setFirstName("Surendra");
            // 通过已赋值的实例调用非静态get方法
            System.out.println(pps.getFirstName());
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        // 去掉static修饰符,改为非静态方法
        public String getFirstName() {
            // this指代当前调用方法的实例,可省略
            return this.firstName;
        }
    }
    

2. 非静态方法中调用非静态成员变量

非静态方法本身会绑定调用它的实例,因此可以直接通过this.成员变量访问,this关键字可以省略,你代码中的setFirstName方法就是标准正确实现。

内容的提问来源于stack exchange,提问作者Surendra Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:18:03