有人可以澄清为什么名字被打印为空在下面的代码?



由于它是一个非静态变量,我试图理解我们应该如何在静态&非静态方法。

代码:

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;
}
}

如果不以某种方式提供实例(例如作为参数,或在本地创建),则不能从静态方法访问非静态数据成员。静态方法不会自然地附加到类的任何实例上,因此在方法中没有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());
}

如果你想在类的所有实例之间共享相同的名字,那么一切都应该是静态的:

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;
}
}

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

如果你想要一个静态方法来返回一个实例变量,你的代码应该是这样的——

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的答案是正确的,你应该如何通常设置/获得一个变量,但在我看来,你是有目的地尝试交叉静态/成员方法。如果我误解了,请按照他的回答去做。

PPS -这也是一个最佳实践,你的主方法是在自己的类。

静态变量在类中声明,可以在类名和类对象之外使用。但最好是类名。

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

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

String firstName;
public static void main(String[] args) {
StackOverFlowTesting pps = new StackOverFlowTesting();
pps.setFirstName("Surendra");
System.out.println(pps.getFirstName());
}
public  String getFirstName() {
//StackOverFlowTesting pps = new StackOverFlowTesting();
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = 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;
}

}

相关内容

最新更新