代码之家  ›  专栏  ›  技术社区  ›  user3903342

Java访问修饰符和调用的方法

  •  2
  • user3903342  · 技术社区  · 7 年前

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

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

    据我所知,非静态调用隐式使用 this SO post , super 不要“坚持”。因此,对于第一种情况, getName() 应使用 Student 指的是 大学生 实例(不考虑访问修饰符)。但事实似乎并非如此。。

    提前感谢!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jacob G.    7 年前

    对于案例1, Student#getName 推翻 Person#getName private 学生#getName 隐式重写 人员#getName (因为现在两者都是 public ), Student 在案例2中打印。

        2
  •  0
  •   dave    7 年前

    在每种情况下 Person.printName() 电话 getName()

    在里面 Case 1 ,唯一可见的版本是 Person.getName() 因此,这对两者都是必要的 Person Student .

    在里面 Case 2 , Student.getName() 人getName() 因此,前者被称为。

    因此,不同的可见性适用于 getName() public (或 protected ),它可能被覆盖,调用的方法将取决于对象。当它是 private ,没有过度骑行和 人getName() 总是被称为。