两个构造函数和静态String变量

时间:2017-12-16 10:22:33

标签: java methods constructor

我有一个相当混乱的课程,我不明白为什么superUser总是被打印出来。我知道如果我写了private String username = "user",那么我就可以用我的main方法调用它:System.out.println(o1.username)。在我的情况下,上面也会打印出superUser,因为它是静态的。但我真的不明白..是因为Java首先完全读取代码并意识到我有第二个对象o2,它有自己的构造函数,其中参数被赋值给局部变量{{ 1}}?

我没有得到的是username打印超级用户的原因。

System.out.println(o1.getUsername());

2 个答案:

答案 0 :(得分:1)

您的username是静态的。这意味着,无论您拥有多少PrintMe个实例,该变量只有一个实例。变量usernamePrintMe的所有实例之间共享。这意味着:

   PrintMe o1 = new PrintMe();
   PrintMe o2 = new PrintMe("superUser");

第二行会将username变量覆盖为superUser。由于在getUsernameo1上调用o2会返回相同的变量,因此您会获得superUser作为输出。

要解决此问题,只需从变量声明中删除单词static

private String username = "user";

答案 1 :(得分:1)

由于username是静态的,因此它不是实例(o1o2)的属性,而是类的属性。使用构造函数PrintMe(String)时,将修改静态username。因此,当o2创建时,username将更改为“superUser”。如果您在创建o1.getUsername()之前打印o2,您将获得“用户”,之后您将获得“超级用户”。删除static的{​​{1}}修饰符,您将获得预期的行为。