2017-12-16 1 views
0

Ich habe eine ziemlich verwirrende Klasse, in der ich nicht verstehe, warum superUser immer gedruckt wird. Ich weiß, wenn ich private String username = "user" geschrieben hätte, dann hätte ich es in meiner main Methode so nennen können: System.out.println(o1.username). In meinem Fall würde das obige superUser auch ausdrucken, weil es statisch ist. Aber ich verstehe es nicht wirklich. Liegt es daran, dass Java den Code zuerst vollständig liest und erkennt, dass ich ein zweites Objekt o2 habe, das seinen eigenen Konstruktor hat, wo das Argument der lokalen Variablen username zugewiesen wird?Zwei Konstruktoren und statische String-Variable

Was ich nicht verstehe ist, warum System.out.println(o1.getUsername()); superUser druckt.

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

Haben Sie [diese] besucht (https://stackoverflow.com/questions/32417953/how-does-the-static-keyword-work-in-java)? BTW, Java ist nicht schwierig;) – vinS

+0

Nichts über Ihre Ausgabe ist unerwartet. Kannst du uns zu den genauen Zeilen führen, die dich verwirren? –

Antwort

1

Ihr username ist statisch. Dies bedeutet, dass es immer nur eine Instanz dieser Variablen gibt, egal wie viele Instanzen von PrintMe Sie haben. Die Variable username wird zwischen allen Instanzen von PrintMe geteilt. Das bedeutet, dass hier:

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

Die zweite Zeile die username Variable überschreibt superUser zu sein. Da der Aufruf getUsername entweder o1 oder o2 die gleiche Variable zurückgibt, erhalten Sie superUser als Ausgabe.

Um dies zu beheben, entfernen Sie einfach das Wort static aus der Variablendeklaration:

private String username = "user"; 
1

Da username statisch ist es nicht eine Eigenschaft der Instanz (o1, o2), aber der Klasse ist. Wenn der Konstruktor PrintMe(String) verwendet wird, wird die statische username geändert. Wenn o2 erstellt wird, wird username in "superUser" geändert. Wenn Sie o1.getUsername() drucken, bevor Sie o2 erstellen, erhalten Sie "user", danach erhalten Sie "superUser". Entfernen Sie den static Modifikator für die username und Sie erhalten das erwartete Verhalten.