2014-04-11 2 views
4

작업 프로그램에서 개인 메서드에서 공용 메서드로의 액세스를 변경하면 컴파일 오류가 발생하지 않고 프로그램 동작이 다르게 작동하는 간단한 프로그램의 예를 보여줄 수 있습니까?컴파일 오류가없는 메서드에 대한 액세스 변경

언제 새 개인 메서드를 추가하면 컴파일 오류가 발생하거나 프로그램 동작이 다르게됩니까?

+1

그리고 너는 너 자신을 이렇게하려고하지 않으니까 ?? – TheLostMind

+0

숙제 냄새가 나는데, 지금까지 시도한 것을 보여줄 수 있습니까? –

+0

하나의 게시물에서 두 개의 질문이 관련되어 있어도 매우 불만 스럽습니다. –

답변

5

이것은 상속을받습니다. 하위 클래스는 상위 클래스의 개인 메서드와 동일한 서명을 가진 메서드를 가질 수 있지만 재정의하지는 않습니다.

이 항목을 현재 실행하면 Foo이됩니다. Super#computeOutput()public으로 변경하면 Bar이 표시됩니다. Sub#computeOutput()이 이제 Super#computeOutput()을 무시하기 때문입니다.

+1

+1 좋은 예. 사람들에게'@ Override'를 사용하도록 유도해야합니다. ;) –

3

새 개인 메서드를 추가하면 컴파일 오류이 발생하거나 프로그램 동작이 다르게됩니까? 당신이 Sub에 개인 방법을 추가하는 경우 doSomething()의 가시성이 감소 되었기 때문에 마크의 코드에서

차입, 다음은 컴파일되지 않습니다.

class Super { 
    public void doSomething() { 
    System.out.println("Foo"); 
    } 
} 

class Sub extends Super {  
    private void doSomething() { 
    System.out.println("Harr!"); 
    } 
} 

또한 때 새 개인 방법 원인 컴파일 중 오류 를 추가하거나 다른을 행동 프로그램으로 이어질 것인가?

개인적인 방법이 이전보다 더 구체적이면 프로그램 동작을 조정할 수 있습니다. 아래 예제는 "foo"를 출력하는 다른 방법을 추가 (주석 해제)하지 않는 한 "bar"를 인쇄합니다.

public class Test { 

    public static void main(String[] args) throws Exception { 
    String foo = "hello"; 
    methodOne(foo); 
    } 

    // private static void methodOne(String args) { 
    // System.out.println("foo"); 
    // } 

    private static void methodOne(Object arg) { 
    System.out.println("bar"); 
    } 
} 
+2

두 번째 경우의 좋은 예. 그리고 이것은 첫 번째 질문에 대답하는 데 사용될 수 있습니다. 'methodOne (Object)'가'public'이고 어떤 코드가 그것을 호출하는 경우,'methodOne (String)'을 public으로 만들면 컴파일러 오류없이 좀 더 구체적인 메소드를 호출하게됩니다 (그러나 재 컴파일이 필요합니다). –