【发布时间】:2018-04-18 02:10:53
【问题描述】:
所以我有以下两种情况:
案例 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 最有意义(这是预期的行为)。
但是为什么案例 1 的输出与案例 2 不同(“Person”而不是“Student”)?
据我了解,非静态调用隐式使用this。并且从此SO post、this 和super 不要“坚持”。因此,对于第一种情况,getName() 应该使用Student 的实现,因为this 指的是Student 实例(无论访问修饰符如何)。但是好像不是这样的。。
提前致谢!
【问题讨论】:
标签: java inheritance this super access-modifiers