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

Java访问修饰符以及调用哪些方法,java,inheritance,this,super,access-modifiers,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 { pri

因此,我有以下两种情况:

案例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”
   }
}
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:

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不同(“人”而不是“学生”)

据我所知,非静态调用隐式地使用
this
。因此,
this
super
不要“粘住”。因此,对于第一种情况,
getName()
应该使用
Student
的实现,因为
这个
引用
Student
实例(不管访问修饰符如何)。但事实似乎并非如此


提前谢谢

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

案例1
中,唯一可见的版本是
Person.getName()
,因此对
Person
Student
都调用该版本

在案例2中,
Student.getName()
覆盖
Person.getName()
,因此调用前者


因此,应用于
getName()
的不同可见性会影响结果。当它是
公共的
(或
受保护的
)时,它可能会被覆盖,调用的方法将取决于对象。当它是
private
时,就没有过度使用,并且总是调用
Person.getName()

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

我也在尝试学习Java。这些也可以设置为受保护且仍然有效吗?@DanielZuzevich绝对可以!只要子类能够从其父类重写该方法,那么子类将调用其
getName
。注意Java中的
public
对象方法也是有用的。因此,案例2的工作方式为何如此;C++/C中的情况并非如此,它需要
Person
getName
上的
virtual
关键字以这种方式工作。