【问题标题】:Two constructors and static String variable两个构造函数和静态字符串变量
【发布时间】:2017-12-16 10:22:33
【问题描述】:

我有一个相当混乱的课程,我不明白为什么总是打印superUser。我知道如果我写了private String username = "user",那么我就可以在我的main 方法中调用它:System.out.println(o1.username)。在我的情况下,上面也会打印出超级用户,因为它是静态的。但我真的不明白..是不是因为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
   }
}

【问题讨论】:

  • 你访问过this吗?顺便说一句,Java 并不难 ;)
  • 您的输出没有什么是意外的。您能指导我们找到让您感到困惑的确切行吗?

标签: java methods constructor


【解决方案1】:

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

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

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

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

private String username = "user";

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2020-07-15
      • 2011-03-01
      • 1970-01-01
      • 2010-09-12
      • 2016-06-23
      • 2014-11-21
      相关资源
      最近更新 更多