有人可以澄清为什么 firstname 在下面的代码中被打印为 null 吗?

Could someone clarify why the firstname is being printed as null in the below code?

因为它是一个非静态变量,我试图了解我们应该如何在静态和非静态方法中调用这个 class 变量。

代码:

public class Person {
    String firstName;

public static void main(String[] args) {
        Person pps = new Person();
        pps.setFirstName("Surendra");
        System.out.println(getFirstName());
}

public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

public static String getFirstName() {
        Person pps = new Person();
        return pps.firstName;
    }

}

如果没有以某种方式提供实例(例如作为参数,或在本地创建),则无法从静态方法访问非静态数据成员。静态方法不会自然地附加到 class 的任何实例,因此方法中没有 this

要从特定实例访问数据成员,您需要在特定实例上调用非静态方法。

public String getFirstName() {
    return this.firstName;
}

public static void main(String[] args) {
    Person pps = new Person();
    pps.setFirstName("Surendra");
    System.out.println(pps.getFirstName());
}

如果您希望 class 的所有实例共享相同的名字,那么一切都应该是静态的:

public class Person {

    static String firstName;

    public static void main(String[] args) {
        Person.setFirstName("Surendra");
        System.out.println(Person.getFirstName());
    }

    public static void setFirstName(String newFirstName) {
        firstName = newFirstName;
    }

    public static String getFirstName() {
        return firstName;
    }

}

尝试从 getFirstName 中删除 Static 部分,然后更改 println 以从创建的 Person 对象调用 getFirstName 方法。

public class Person {
        String firstName;
    
    public static void main(String[] args) {
            Person pps = new Person();
            pps.setFirstName("Surendra");
            System.out.println(pps.getFirstName());
    }
    
    public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
    public String getFirstName() {
            Person pps = new Person();
            return pps.firstName;
        }
    
    }

问题是您在 getter 中创建了一个新的 Person,这使得您之前在 Main 方法中的代码变得无关紧要,因为您正在查询从未设置过的第二个 Person 的名字。由于您的静态方法无法访问实例,因此您需要传入实例。

如果您想要一个静态方法 return 一个实例变量,您的代码应该是这样的 -

public static String getFirstName(Person pps) {
        return pps.firstName;
    }

public static void main(String[] args) {
    Person pps = new Person();
    pps.setFirstName("Surendra");
    System.out.println(Person.getFirstName(pps));
}

PS- rkeckol 关于您通常应该如何 set/get 变量的回答是正确的,但在我看来您是在有目的地试验交叉 static/member 方法。如果我误解了,那么按照他的回答来代替

PPS - 这也是您的主要方法的最佳实践 class.

静态变量在 class 内部声明,可以在 class 外部使用 class 名称和 class 对象。但首选 class 名称。

非静态变量不能在静态块或静态方法中使用,但静态变量可以在非静态和静态方法中使用。

所以,要么'firstName'作为一个静态变量。或者将 getFirstName 作为非静态方法,如下所示。

     String firstName;

public static void main(String[] args) {
    WhosebugTesting pps = new WhosebugTesting();
        pps.setFirstName("Surendra");
        System.out.println(pps.getFirstName());
}
public  String getFirstName() {
    //WhosebugTesting pps = new WhosebugTesting();
        return this.firstName;
    }
public void setFirstName(String firstName) {
    this.firstName = firstName;
}