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 postthissuper 不要 "stick"。因此,对于第一种情况,getName() 应该使用 Student 的实现,因为 this 指的是 Student 实例(不考虑访问修饰符)。但事实并非如此..

提前致谢!

在每种情况下 Person.printName() 调用 getName().

Case 1 中,唯一可见的版本是 Person.getName(),因此 PersonStudent 都需要它。

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 中打印。