2017-12-16 4 views
0

다소 혼란스러운 클래스가 있는데, 왜 superUser이 항상 인쇄되고 있는지 이해할 수 없습니다. 나는 만약 내가 private String username = "user"라고 쓰면, System.out.println(o1.username)과 같은 나의 main 메쏘드에서 그것을 부를 수 있었을 것이라는 것을 안다. 필자의 경우 위의 코드는 정적이기 때문에 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 
    } 
} 
+1

[this] (https://stackoverflow.com/questions/32417953/how-does-the-static-keyword-work-in-java)를 방문하셨습니까? BTW, Java는 어렵지 않습니다.) – vinS

+0

출력에 대해 아무 것도 예기치 않습니다. 당신을 혼란스럽게하는 정확한 라인으로 안내 할 수 있습니까? –

답변

1

username은 정적입니다. 즉, PrintMe의 인스턴스 수에 관계없이 해당 변수의 인스턴스가 하나만 존재한다는 것을 의미합니다. 변수 usernamePrintMe의 모든 인스턴스간에 공유됩니다.

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

번째 라인 superUser가되도록 변수를 덮어 username이 여기에 있다는 것을 의미한다. 을 o1 또는 o2에 반환하면 동일한 변수가 반환되므로 superUser이 출력됩니다.

는 단순히 변수 선언에서 말씀 static을 제거,이 문제를 해결하려면 정적

private String username = "user"; 
1

username 때문에이 인스턴스 (o1, o2)하지만 클래스의 속성이 아니다. 생성자 PrintMe(String)이 사용되면 정적 username이 수정됩니다. 따라서 o2이 생성되면 username은 "수퍼 유저"로 변경됩니다. o2을 만들기 전에 o1.getUsername()을 인쇄하면 "사용자"가 나오고, 나중에 "수퍼 유저"가됩니다. username에 대한 static 수정자를 제거하면 예상대로 동작합니다.