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

