所以我有以下两种情况:
案例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
实例(无论访问修饰符如何)。但事实并非如此......
提前致谢!
答案 0 :(得分:2)
对于案例1,Student#getName
执行不覆盖Person#getName
,因为方法为private
,这意味着其他类无法访问它们。由于Student#getName
隐式覆盖Person#getName
(因为两者现在都是public
),因此在案例2中打印Student
。
答案 1 :(得分:0)
在每种情况下Person.printName()
都会调用getName()
。
在Case 1
中,唯一可见的版本为Person.getName()
,因此Person
和Student
都会调用此版本。
在Case 2
中,Student.getName()
会覆盖Person.getName()
,因此会调用前者。
因此,应用于getName()
的不同可见性会影响结果。当它public
(或protected
)时,它可以被覆盖,并且调用的方法将取决于对象。当它private
时,没有超越,并且始终会调用Person.getName()
。