两个构造函数和静态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实例,该变量只有一个实例。变量usernamePrintMe的所有实例之间共享。这意味着:

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

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

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

private String username = "user";
另一答案

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

以上是关于两个构造函数和静态String变量的主要内容,如果未能解决你的问题,请参考以下文章

JAVA笔试题(与构造函数、静态变量有关)

JAVA笔试题(与构造函数、静态变量有关)

java代码块,静态代码块,静态变量,构造方法执行顺序

java中成员变量代码块构造函数运行顺序

(Java)类实例化过程中,父类和子类的静态变量静态代码块成员变量构造函数的执行顺序是什么?

使用类的静态字段和构造函数,跟踪某个类所创建对象的个数。