2013-11-01 2 views
1

프로덕션에서는별로 의미가 없기 때문에 전에 다음 코드를 작성하지 않았습니다. 그러나 놀랍게도이 코드는 성공적으로 컴파일됩니다. 같은 클래스의 인스턴스에서 정적 메서드의 private 메서드를 호출 할 수 있도록 설계된 이유는 무엇입니까?왜 정적 메서드는 개인 메서드를 호출 할 수 있습니까?

public class Beverage { 
    private void drink() { 
     System.out.println("Beverage"); 
    } 

    public static void main (String[] args) {  
     Beverage b = new Beverage(); 
     b.drink(); //call to private method! 
    } 
} 

답변

6

왜 전화를 걸 수 없습니까? private은 동일한 클래스에 대한 액세스를 제한합니다. 정적 메서드는 같은 클래스에 있습니다. 따라서 개인 메서드에 액세스 할 수 있습니다.

액세스 수정자는 인스턴스 수준이 아닌 클래스 수준에서 작동합니다. 그들은 인스턴스 레벨에서 작업 했으므로 static 팩토리 메서드 (private constructor 및 초기화 메서드 호출), equals() 메서드 및 compareTo 메서드 (두 인스턴스의 private 필드 비교) 등을 작성할 수 없습니다.

+1

정적 공장 방법에 대한 좋은 점! 그것에 대해 완전히 잊었습니다. –

0

정적 멤버는 클래스 멤버입니다. 비 정적 멤버는 인스턴스 멤버입니다. 여기서 인스턴스를 사용하여 인스턴스 메소드를 호출했습니다. 그러나 당신은 아래와 같이 부를 수 없다.

public class Beverage { 
    private void drink() { 
     System.out.println("Beverage"); 
    } 

    public static void main (String[] args) {  

     drink(); //call to private method!this is wrong no matter private or public 
    } 
} 
2

액세스 수준 수정은 다른 클래스 특정 필드를 사용하거나 특정 메소드를 호출 할 수 있는지 여부를 결정합니다. private 액세스 지정자는 클래스 외부에서 가시성을 제한하지만 메소드/필드를 클래스 내부에서보고 사용할 수 있습니다.

0

당신이 알아 차린 행동은 private의 정의와 가장 일치하는 동작입니다.

Java에서 private은 "동일한 클래스 내에서만 호출 할 수 있음"을 의미합니다. "소유물에 의해서만 호출 될 수 있음"을 의미하지는 않습니다. 나는 이것이 Java의 기원에 의한 것 같다고 생각한다. C++과의 유사성 때문에 많은 결정이 내려졌다.이 정의는 private이라는 정의와 동일하다.

또한 private 생성자 만있는 클래스가 있고 클래스를 인스턴스화하는 데 static 메서드가있는 등의 작업을 수행 할 수 있습니다.

1

비 정적 메서드를 포함하는 클래스의 인스턴스를 사용하여 정적 메서드에서 비 정적 메서드에 액세스 할 수 있습니다. 당신이 인스턴스를

  • 을 가지고 그래서 여기

    1. 당신은 당신이 동일한 클래스의 두 가지 방법으로 private 메소드를 호출 할 수 있습니다 비 정적 메서드를 호출 할 수 있습니다.

  • 관련 문제