两个构造函数和静态String变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个构造函数和静态String变量相关的知识,希望对你有一定的参考价值。
我有一个相当混乱的课程,我不明白为什么superUser
总是被打印。我知道,如果我写了private String username = "user"
,那么我就可以用我的main
方法调用它:System.out.println(o1.username)
。在我的情况下,上面也会打印出superUser,因为它是静态的。但我真的没有得到它..是因为Java首先完全读取代码并且意识到我有第二个对象o2
,它有自己的构造函数,其中参数被赋值给局部变量username
?
我没有得到的是为什么System.out.println(o1.getUsername());
打印超级用户。
public class PrintMe {
private static String username = "user";
private int password = 1234;
public PrintMe(){}
public PrintMe(String username){
PrintMe.username = username;
this.password = 5678;
}
public void changePassword(int password){
System.out.println("The old password of " + this.getUsername() +
" was " + this.password);
this.password = password;
}
public String getUsername(){
return PrintMe.username;
}
public static void main(String[] args){
PrintMe o1 = new PrintMe();
PrintMe o2 = new PrintMe("superUser");
System.out.println(o1.getUsername()); // superUser
System.out.println(o1.password); // 1234
System.out.println(o2.getUsername()); // superUser
System.out.println(o2.password); // 5678
o1.changePassword(9000); // The old password of superUser was 1234
System.out.println(o1.getUsername()); // superUser
System.out.println(o1.password); // 9000
System.out.println(o2.getUsername()); // superUser
System.out.println(o2.password); // 5678
}
}
你的username
是静态的。这意味着,无论你有多少PrintMe
实例,该变量只有一个实例。变量username
在PrintMe
的所有实例之间共享。这意味着:
PrintMe o1 = new PrintMe();
PrintMe o2 = new PrintMe("superUser");
第二行将username
变量覆盖为superUser
。因为在getUsername
或o1
上调用o2
会返回相同的变量,所以你得到superUser
作为输出。
要解决此问题,只需从变量声明中删除单词static
:
private String username = "user";
由于username
是静态的,它不是实例(o1
,o2
)的属性,而是类的属性。当使用构造函数PrintMe(String)
时,修改静态username
。因此,当创建o2
时,username
将更改为“superUser”。如果您在创建o1.getUsername()
之前打印o2
,您将获得“user”,之后您将获得“superUser”。删除static
的username
修饰符,您将获得预期的行为。
以上是关于两个构造函数和静态String变量的主要内容,如果未能解决你的问题,请参考以下文章