有人可以澄清为什么 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;
}
因为它是一个非静态变量,我试图了解我们应该如何在静态和非静态方法中调用这个 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;
}