2017-11-06 28 views
2

그래서이 다음 이가지 경우 :자바 - 액세스 수정 및 어떤 방법은 호출 있습니까

사례 1 :

public class Person { 
    private String name = "Person"; 
    private String getName() { 
     return name; 
    } 

    public void printName() { 
     System.out.println(getName()); 
    } 
} 

public class Student extends Person { 
    private double gpa = 0; 
    private String getName() { 
     return “Student”; 
    } 
} 

public class Driver { 
    public static void main(String[] args){ 
     Person p = new Person(); 
     Student s = new Student(); 

     p.printName(); // “Person” 
     s.printName(); // “Person” 
    } 
} 

사례 2 :

public class Person { 
    private String name = "Person"; 
    public String getName() { 
     return name; 
    } 

    public void printName() { 
     System.out.println(getName()); 
    } 
} 

public class Student extends Person { 
    private double gpa = 0; 
    public String getName() { 
     return “Student”; 
    } 
} 

public class Driver { 
    public static void main(String[] args){ 
     Person p = new Person(); 
     Student s = new Student(); 

     p.printName(); // “Person” 
     s.printName(); // “Student” 
    } 
} 

사례 2 가장 의미가 있습니다 (의도 된 동작 임).

그러나 왜 Case 1은 Case 2 ("Student"대신 "Person")와 동일한 결과를 출력하지 않습니다?

내가 이해 한대로, 비 정적 호출은 암시 적으로 this을 사용합니다. 그리고이 SO post에서 thissuper은 "붙지"않습니다. 따라서 첫 번째 경우에 대해 getName()Student의 구현을 사용해야합니다. thisStudent 인스턴스를 나타냅니다 (액세스 한정자와 상관 없음). 하지만 그럴 것 같지 않습니다 ..

미리 감사드립니다!

답변

3

사례 1의 경우, Student#getName은 다른 클래스에 액세스 할 수없는 의미, 하지 재정 Person#getName 않습니다. Student#getNamePerson#getName을 암시 적으로 덮어 쓰기 때문에 (둘 다 현재 public이므로) 케이스 2에 Student이 인쇄됩니다.

+1

저는 Java도 배우려고합니다. 이것들도 보호 설정되어 여전히 작동 할 수 있습니까? –

+2

@DanielZuzevich 물론입니다! 자식 클래스가 부모로부터 메소드를 오버라이드 할 수있는 한, 자식은'getName'을 호출 할 것입니다. –

+1

Java의'public' 객체 메소드도 ['virtual'] (https://en.wikipedia.org/wiki/Virtual_function)이라는 점에 유의하십시오. 따라서 케이스 2가 왜 그런 식으로 작동하는지; C++/C#에서는'Person'의'getName'에'virtual' 키워드가 있어야이 방식으로 작동합니다. – Powerlord

1

각 경우 Person.printName()getName()입니다.

Case 1에서 볼 수있는 버전은 Person.getName()이므로 PersonStudent 모두 호출됩니다.

Case 2에서 Student.getName()Person.getName()을 무시하므로 전자가 호출됩니다.

다른 가시성이 getName()에 적용되면 결과에 영향을줍니다. public (또는 protected) 일 때 오버 라이딩 될 수 있으며 호출되는 메소드는 오브젝트에 따라 달라집니다. private 일 때 초과 승차가없고 항상 Person.getName()이라고합니다. 방법은 private만큼