2015-01-08 2 views
2
public class Test { 
    public static void main(String args[]){ 
     Student s = new Student(); 
     s.printPerson(); 
    } 
} 

class Person{ 
    private String getInfo(){ 
     return "Person"; 
    } 
    public void printPerson(){ 
     System.out.println(getInfo()); 
    } 
} 

class Student extends Person{ 
    private String getInfo(){ 
     return "Student"; 
    } 
} 

출력은 Person입니다. 나는이 결과와 혼동스러워한다. 기본 방법에서 참조 유형은 Student입니다. 따라서 s.printPerson()을 실행할 때 Student 메서드를 실행해야합니다. 요점은, superclass에서 상속받은 public 메소드에서 어떤 private 메소드가 호출 되는가입니다. 그리고 왜?Java : superclass에서 상속 된 public 메서드는 private 메서드를 호출합니다.

나는 s.printPerson()에서 생각했는데 getInfo()Student입니다. 그러나 그것은 밝혀지지 않았습니다. IDE에서 나에게 알립니다.

private String getInfo(){ 
     return "Student"; 
} 

절대 사용하지 마십시오.

누구든지 나를 도와 줄 수 있습니까?

+0

클래스'Person'에서'getInfo()'를 호출하면 "Person"이 출력된다는 것을 이해합니다. 하지만 제 코드에서는'Person'이 아니라'Student' 클래스에서'getInfo()'를 호출합니다. 'Student'에서'getInfo()'를 호출하면'Student'가 아닌'Person'의'printPerson()'메소드를 호출하는 것으로 보입니다. 나는이 문제와 혼동을 느낀다. – RogerS

+0

코드를 조금 수정합니다. 나는'Student'의'getInfo()'를'Person'에서 정확히 같은 코드로 덮어 씁니다. 이제 결과는 "학생"입니다. 상속 방법의 메커니즘에 대해 궁금합니다. 나는 출력이 같아야한다고 생각했다. getInfo()를 오버라이드했는지 아닌지, 메소드의 내용이 같아서 출력이 동일해야하기 때문이다. 아무도 이걸로 나를 도울 수 있습니까? 고마워. – RogerS

답변

1

Java의 경우 private methods are not inherited.

하위 클래스는 부모 클래스의 private 멤버를 상속받지 않습니다. 다만, 슈퍼 클래스가 비공개 필드에 액세스하기위한 public 또는 protected 메소드를 가지고있는 경우, 이것들은 서브 클래스에서도 사용할 수 있습니다.

당신은이 상속되지 있기 때문에 다른 getInfo 방법을 만들어 getInfo을 무시할 수 없습니다. 그래서 IDE는 Student의 아무 것도 사용하지 않기 때문에 "사용하지 않았 음"이라는 경고를주었습니다. PersonprintPerson 메서드에서 사용 가능하므로 Person이 인쇄되므로 getInfo에서 Person을 호출합니다.

메서드를 재정의하려면 private이 아니어야합니다. getInfo package-private (액세스 수정 자 없음), protected 또는 public을 만들 수 있습니다. 그러면 Student이이를 덮어 쓸 수 있습니다.

2

private 수정자를 사용합니다. 이 변경자는 메소드가 클래스 자체에서만 볼 수 있으며 다른 클래스는 표시하지 않으며 하위 클래스 및 수퍼 클래스도 볼 수 없음을 의미합니다. 따라서 Person 클래스에서 을 호출하면 Person 클래스에 정의 된 메서드 만 표시됩니다. 사실 이것은 Java에서 개인 메소드가 상속되지 않는다는 것을 의미합니다.

private 수정자를 protected으로 변경하십시오. 그런 다음 하위 클래스는 수퍼 클래스에서 메서드를 볼 수 있으므로 메서드를 오버라이드 할 수 있습니다.

+0

하위 클래스의 메서드는 수퍼 클래스에서 (개인 메서드뿐만 아니라) 볼 수 없다고 생각합니다. 내가 잘못? –

+0

대답 해 주셔서 감사합니다. 나는 여전히 이해하지 못했다. 'Student' 클래스가 아닌'Student' 클래스의'getInfo()'메소드를 호출합니다. 'Student'클래스의'printPerson()'을 호출해야합니까?자세한 내용은 원래 게시물의 주석에 있습니다. 고맙습니다. – RogerS