为什么受保护范围不起作用?

Why protected scope is not working?

我正在尝试使用 Java 的受保护范围进行练习。

我在 package1 中有一个 Base class:

package package1;

 public class Base {

     protected String messageFromBase = "Hello World";

    protected void display(){
        System.out.println("Base Display");
    }

}

我在同一个包裹中有一个邻居 class:

package package1;

public class Neighbour {

    public static void main(String[] args) {
        Base b =  new Base();
        b.display();
    }
}

然后我在另一个包中有一个child class,它继承自Base from package1:

package package2;

import package1.Base;

 class Child extends Base {


    public static void main(String[] args) {
        Base base1 = new Base();
        base1.display(); // invisible
        System.out.println(" this is not getting printed" + base1.messageFromBase); // invisible

    }


}

我的问题是 child 实例没有调用 display() 方法。此外,base1.messageFromBase 不可访问,尽管它们被声明为受保护。

注意一些关于protected访问的事情

-They are available in the package using object of class
-They are available outside the package only through inheritance
-You cannot create object of a class and call the `protected` method outside package on it 

它们只能通过包外的继承来调用。您不必创建基础 class 的对象然后调用,您可以简单地调用 display()

class Child extends Base {
 public static void main(String[] args) {
    Child child = new Child();
    child.display(); 
  }
}

Makoto 专家在他提供的答案中提供了 link 作为官方文档。

您使用的是 parent class,而不是 child class,当您试图调用受保护的方法并访问受保护的字段。由于您在 main 中,没有使用 Childnot in the same package as Base 的实例,您将无法单独通过父级访问该字段或方法。

您应该创建一个 Child 的新实例来调用您想要的方法。

 class Child extends Base {
    public static void main(String[] args) {
        Child child = new Child();
        child.display();
        System.out.println(" this will get printed" + child.messageFromBase);

    }
}