2014-05-19 2 views
0

나는 나의 인증 시험을 위해 공부하고 있는데, 컴파일하고 실행하는이 예제를 실행한다. 그러나 문제는 내가 컴파일해야한다고 생각하지 않는다는 것이다. 왜냐하면이 메소드는 private이기 때문에 우리는 클래스의 인스턴스에서 private 메서드를 호출합니다. 누군가 그것이 왜 작동하는지 설명해 주시겠습니까?이 Java 코드가 컴파일되어 실행되는 이유는 무엇입니까? 나는 그것을 이해하지 못한다

public class Test { 
    public static void main(String[] args) { 
     Test instance = new Test(); 
     System.out.println(instance.number()); 
    } 

    /* protected */ private int number() { 
     try { 
      new RuntimeException(); 
     } finally { 
      return 1; 
     } 
    } 
} 
+2

그 방법은 '비공개'가 아닙니다. 바로 그곳이 '보호 받았다'고합니다. – awksp

+3

첫 번째 메시지는 * protected *이며 개인 메시지는 아닙니다. 둘째 : 비록 그것이 개인적인 것이 라해도 당신은 여전히 ​​정의 클래스의 어떤 메소드에서든지 접근 할 수 있습니다. private은 "class private"이 아닌 "private private"를 의미합니다. –

+0

어쨌든 클래스에서 작업 중이므로 해당 메서드에 액세스 할 수 없습니다. – awksp

답변

3

개인 메소드와 필드를 잘 작성하지 인스턴스 메서드 내에서 호출 된 경우에도 선언 클래스 어디서나 액세스 할 수 있습니다 코드의 메서드는 처음에 이 아니고 protected이 아니며 (보호 된 메서드는 동일한 패키지의 모든 위치와 파생 클래스의 패키지 외부에서 액세스 할 수 있습니다). 나는 그것을 지금 private로 수정했습니다. 또한 이러한 코드가 컴파일되어 실행됩니다.

3

내가 시도 (당신이 System.exit를 호출하지 않는 한)는 finally 블록 실행이 보장되는 것을 기억할 것 : 여기

는 코드입니다.

public class Test { 
    public static void main(String[] args) { 
    Test instance = new Test(); // <-- instantiate a Test instance. 
    System.out.println(instance.number()); // call get number method. gets 1 
    } 
    protected int number() { 
    try { 
     /* throw */ new RuntimeException(); // instantiates an unchecked exception. 
     // even if you threw it, it wouldn't matter.... 
     // even if you did return 0; 
    } finally { 
     return 1; // swallows the unchecked exception and returns 1. 
    } 
    } 

}

+0

'new RuntimeException();'은 실제로는 런타임 예외를 발생시키지 않고 단지 새로운 인스턴스를 인스턴스화합니다. – niiru

+0

@niiru 잘 잡았지만 문제가되지 않습니다 ... 여전히 1을 반환합니다. –

+0

100 % 동의! 나는 사람들이 우연히 예외를 초기화 할 때 그들이 던질 의도가있을 때 발생하기 쉬운 버그를 발견했다. – niiru

2

보호 클래스는 같은 패키지/클래스 또는 서브 클래스 다음을 호출하는 경우에서와 같이, 아무 문제가 없다.

실제로 보호는 개인보다 덜 제한적입니다.

class Test { 
     private void doThis() {}; 

     public static void main() { 
     Test a = new Test(); 
     Test b = new Test(); 

     a.doThis(); // No problem 
     b.doThis(); // No problem 
     } 
    } 

추신 :

In Java, difference between default, public, protected, and private