所以我有以下两种情况:
情况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
实例(无论访问修饰符如何)。但事实似乎并非如此..
提前致谢!
最佳答案
对于情况 1,Student#getName
不会覆盖 Person#getName
,因为这些方法是私有(private)
,这意味着其他类无法访问它们。由于 Student#getName
隐式覆盖 Person#getName
(因为两者现在都是 public
),因此 Student
会打印在 Case 中2.
关于Java - 访问修饰符以及调用哪些方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128048/