Java - 访问修饰符和调用的方法
Java - Access Modifiers and Which Methods Are Called
所以我有以下两种情况:
案例一:
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”
}
}
案例二:
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
不要 "stick"。因此,对于第一种情况,getName()
应该使用 Student
的实现,因为 this
指的是 Student
实例(不考虑访问修饰符)。但事实并非如此..
提前致谢!
在每种情况下 Person.printName()
调用 getName()
.
在 Case 1
中,唯一可见的版本是 Person.getName()
,因此 Person
和 Student
都需要它。
在Case 2
中,Student.getName()
覆盖Person.getName()
,因此称为前者。
因此,应用于 getName()
的不同可见性会影响结果。当它是 public
(或 protected
)时,它可以被覆盖,调用的方法将取决于对象。当它是 private
时,没有覆盖并且总是调用 Person.getName()
。
对于案例 1,Student#getName
不会 覆盖 Person#getName
,因为这些方法是 private
,这意味着其他人无法访问它们类。因为 Student#getName
隐式覆盖 Person#getName
(因为现在两者都是 public
),所以 Student
在案例 2 中打印。
所以我有以下两种情况:
案例一:
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”
}
}
案例二:
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
不要 "stick"。因此,对于第一种情况,getName()
应该使用 Student
的实现,因为 this
指的是 Student
实例(不考虑访问修饰符)。但事实并非如此..
提前致谢!
在每种情况下 Person.printName()
调用 getName()
.
在 Case 1
中,唯一可见的版本是 Person.getName()
,因此 Person
和 Student
都需要它。
在Case 2
中,Student.getName()
覆盖Person.getName()
,因此称为前者。
因此,应用于 getName()
的不同可见性会影响结果。当它是 public
(或 protected
)时,它可以被覆盖,调用的方法将取决于对象。当它是 private
时,没有覆盖并且总是调用 Person.getName()
。
对于案例 1,Student#getName
不会 覆盖 Person#getName
,因为这些方法是 private
,这意味着其他人无法访问它们类。因为 Student#getName
隐式覆盖 Person#getName
(因为现在两者都是 public
),所以 Student
在案例 2 中打印。