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

问题描述 投票:0回答:2

我有一个相当混乱的课程,我不明白为什么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
   }
}
java methods constructor
2个回答
1
投票

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

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

第二行将username变量覆盖为superUser。因为在getUsernameo1上调用o2会返回相同的变量,所以你得到superUser作为输出。

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

private String username = "user";

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.