그래서이 다음 이가지 경우 :자바 - 액세스 수정 및 어떤 방법은 호출 있습니까
사례 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에서 this
과 super
은 "붙지"않습니다. 따라서 첫 번째 경우에 대해 getName()
은 Student
의 구현을 사용해야합니다. this
은 Student
인스턴스를 나타냅니다 (액세스 한정자와 상관 없음). 하지만 그럴 것 같지 않습니다 ..
미리 감사드립니다!
저는 Java도 배우려고합니다. 이것들도 보호 설정되어 여전히 작동 할 수 있습니까? –
@DanielZuzevich 물론입니다! 자식 클래스가 부모로부터 메소드를 오버라이드 할 수있는 한, 자식은'getName'을 호출 할 것입니다. –
Java의'public' 객체 메소드도 ['virtual'] (https://en.wikipedia.org/wiki/Virtual_function)이라는 점에 유의하십시오. 따라서 케이스 2가 왜 그런 식으로 작동하는지; C++/C#에서는'Person'의'getName'에'virtual' 키워드가 있어야이 방식으로 작동합니다. – Powerlord