2017-12-16 9 views
0

私はかなり複雑なクラスを持っていますが、なぜsuperUserが常に印刷されているのか分かりません。もし私がprivate String username = "user"と書いたとしたら、私はSystem.out.println(o1.username)のような私のmainメソッドでそれを呼び出すことができたでしょう。私の場合は、静的であるため、上記のようにsuperuserも表示されます。しかし、私は本当にそれを取得しません..それはJavaがコードを完全に読み込んで、引数がローカル変数usernameに割り当てられている独自のコンストラクタを持つo2という2番目のオブジェクトがあることを認識しているからですか?2つのコンストラクタと静的な文字列変数

私には分かりませんが、なぜ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 
    } 
} 
+1

[this](https://stackoverflow.com/questions/32417953/how-does-the-static-keyword-work-in-java)を訪問しましたか?ところで、Javaは難しくありません;) – vinS

+0

あなたの出力に関する何も予期せぬものです。あなたを混乱させる正確な行に私たちを案内できますか? –

答えて

1

usernameは静的です。これは、あなたが持っているPrintMeのインスタンス数にかかわらず、その変数のインスタンスが1つしかないことを意味します。変数usernameは、PrintMeのすべてのインスタンスで共有されます。

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

二行目はsuperUserするusername変数を上書きします。これは、ここにあることを意味します。 getUsernameo1またはo2に返すと、同じ変数が返されるため、出力としてsuperUserが返されます。

は、単に変数宣言から単語staticを削除し、この問題を解決するには、静的である

private String username = "user"; 
1

usernameので、インスタンス(o1o2)が、クラスのプロパティのではありません。コンストラクタPrintMe(String)を使用すると、スタティックusernameが変更されます。したがって、o2が作成されると、usernameは「スーパーユーザー」に変更されます。 o2を作成する前にo1.getUsername()を印刷すると、「ユーザー」が得られます。その後、「スーパーユーザー」が表示されます。 usernamestatic修飾子を削除すると、正常に動作します。

関連する問題