2011-02-28 2 views
0

CODE : 1다음 두 프로그램의 차이점은 무엇입니까?

class Ajay { 
    private void display() { 
     System.out.println("Ajay"); 
    } 
    public static void main(String ...strings){ 
     Ajay r=new Ravi(); 
     r.display(); 
    } 
} 

class Ravi extends Ajay{ 
    public void display() { 
     System.out.println("ravi"); 
    } 
} 

CODE : 2

class Ravi { 
    private void display() { 
     System.out.println("ravi"); 
     } 
    } 

public class Ajay extends Ravi{ 
    public void display() { 
     System.out.println("ajay"); 
    } 
    public static void main(String ...strings){ 
    Ravi r=new Ajay(); 
     r.display(); 
    } 
} 

는 I 위의 두 코드 역시있다. CODE 1은 오류없이 실행되지만 CODE 2는 메서드가 표시되지 않는 오류가 발생합니다. 이 오류의 원인은 무엇입니까 ??

+0

참고 : 코드 2는 "오류가 발생하지 않습니다."컴파일시 오류가 발생하여 컴파일하지 못합니다. 오류 (및 예외)는 런타임에만 throw 할 수 있습니다. –

+0

okk.I 질문을 올바르게 틀 수 없습니다. 왜 코드 2가 컴파일되지 않을까요? –

답변

4

두 번째 예제에서는 변수에 display() 메서드를 호출 해보십시오. Ravi에는이 위치에서 액세스 할 수있는 display() 방법이 없습니다 (즉, Ajay 내부). 첫 번째 예에서

, 그러나 당신은 Ajay에서 Ajay의 개인 display() 메서드를 호출합니다. private 메서드를 호출하면 이 아니라이 런타임 다형성을 사용합니다. 호출되는 정확한 코드는 컴파일시에 결정됩니다! 2 코드

1

코드 2에서 클래스 Ravi의 표시 방법은 private입니다.

이제 Ravi의 참조 "r"을 사용하여 display를 호출하지만 display Ravi 클래스 외부에서 display() 메서드를 볼 수 없습니다.

가시성을 줄일 수 없기 때문에 Ajay 클래스에서는 public (public)과 동일한 메소드 display()를 사용하지만 수퍼 클래스를 대체하지는 않습니다.

+0

코드 1 에서처럼 (적어도 하나의 버전 에서처럼) –

0

오류 메시지는 CODE2 예제의 display 메서드가 private이라는 사실과 관련되어 있으므로 호출 할 수 없습니다.

0

제공 솔루션 옵션 :

class Ravi { 
    protected void display() { 
     System.out.println("ravi"); 
     } 
    } 
} 

또는 같은 : 당신은 "라비"를 표시하려면

, 다음 중 하나와 같은 표시 방법을 선언 할 수있다

class Ravi { 
    public void display() { 
     System.out.println("ravi"); 
     } 
    } 
} 

"ajay"를 표시하려면 호출을 변경하십시오.

Ravi r=new Ajay(); 
    if(r instanceof Ajay) 
     ((Ajay) r).display(); 
} 
관련 문제