我有一个相当混乱的课程,我不明白为什么superUser
总是被打印出来。我知道如果我写了private String username = "user"
,那么我就可以用我的main
方法调用它:System.out.println(o1.username)
。在我的情况下,上面也会打印出superUser,因为它是静态的。但我真的不明白..是因为Java首先完全读取代码并意识到我有第二个对象o2
,它有自己的构造函数,其中参数被赋值给局部变量{{ 1}}?
我没有得到的是username
打印超级用户的原因。
System.out.println(o1.getUsername());
答案 0 :(得分:1)
您的username
是静态的。这意味着,无论您拥有多少PrintMe
个实例,该变量只有一个实例。变量username
在PrintMe
的所有实例之间共享。这意味着:
PrintMe o1 = new PrintMe();
PrintMe o2 = new PrintMe("superUser");
第二行会将username
变量覆盖为superUser
。由于在getUsername
或o1
上调用o2
会返回相同的变量,因此您会获得superUser
作为输出。
要解决此问题,只需从变量声明中删除单词static
:
private String username = "user";
答案 1 :(得分:1)
由于username
是静态的,因此它不是实例(o1
,o2
)的属性,而是类的属性。使用构造函数PrintMe(String)
时,将修改静态username
。因此,当o2
创建时,username
将更改为“superUser”。如果您在创建o1.getUsername()
之前打印o2
,您将获得“用户”,之后您将获得“超级用户”。删除static
的{{1}}修饰符,您将获得预期的行为。