Java - 访问修饰符和调用哪些方法

时间:2017-11-06 00:17:23

标签: java inheritance this super access-modifiers

所以我有以下两种情况:

案例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 postthissuper不要"坚持"。因此,对于第一种情况,getName()应使用Student的实现,因为this引用Student实例(无论访问修饰符如何)。但事实并非如此......

提前致谢!

2 个答案:

答案 0 :(得分:2)

对于案例1,Student#getName执行覆盖Person#getName,因为方法为private,这意味着其他类无法访问它们。由于Student#getName隐式覆盖Person#getName(因为两者现在都是public),因此在案例2中打印Student

答案 1 :(得分:0)

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

Case 1中,唯一可见的版本为Person.getName(),因此PersonStudent都会调用此版本。

Case 2中,Student.getName()会覆盖Person.getName(),因此会调用前者。

因此,应用于getName()的不同可见性会影响结果。当它public(或protected)时,它可以被覆盖,并且调用的方法将取决于对象。当它private时,没有超越,并且始终会调用Person.getName()