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

标签 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实例(无论访问修饰符如何)。但事实似乎并非如此..

提前致谢!

最佳答案

对于情况 1,Student#getName 不会覆盖 Person#getName,因为这些方法是私有(private) ,这意味着其他类无法访问它们。由于 Student#getName 隐式覆盖 Person#getName(因为两者现在都是 public),因此 Student 会打印在 Case 中2.

关于Java - 访问修饰符以及调用哪些方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128048/

相关文章:

java - 如何输出我存储的这些信息?

java - 从深层链接中的 Intent 获取空值

java - ActiveMQ的InactivityMonitor会看到哪些数据来检查连接可用性?

java - 当接口(interface)完全抽象时,为什么说接口(interface)支持多重继承?

c++ - 当基类函数已经因不同的访问而重载时如何处理名称隐藏

java - Eclipse RCP CoolBar 操作 FORCE_TEXT

Javascript 继承和 Angular 服务

javascript - 从原型(prototype)函数访问属性

javascript - '$(this)' 和 'this' 有什么区别?

JavaScript 范围澄清