1

这是我现在正在测试的一段代码,我注意到当我在 Person 的 getInfo() 方法上将 public 更改为 private 时,Student().printPerson() 和 Person().printPerson () 打印出“人”。但是,当它公开时,会显示“学生”。有人可以解释一下吗?为什么 private 修饰符不允许 Student 访问 getInfo 方法?

        new Student().printPerson();
        new Person().printPerson();
      }
    }

    class Student extends Person {
        public Student(){
        System.out.println("student invoked")   ;
        }

      public String getInfo() {
        return "Student";
      }
    }

    class Person {
     public Person(){

    System.out.println("person invoked");

     }
        private String getInfo() {
        return "Person";
      }

      public void printPerson() {
        System.out.println(getInfo());
      }
4

1 回答 1

5

publicJava 中的(或protected)方法始终是虚拟的。

这意味着如果派生类覆盖了该方法,则通过基类进行的调用将调用派生类(如果对象实际上是派生类的实例)。

当您的基本方法是public时,会发生这种情况,并从printPerson()调用覆盖的派生版本中调用它。

当它是 时private,它不是虚拟的,所以来自基类的调用总是调用基版本(因为它不知道派生类的方法)。

于 2013-09-12T00:32:52.200 回答