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

时间:2015-04-27 06:36:02

标签: java protected

我正在尝试使用Java的受保护范围。

我在package1中有一个Base类:

package package1;

 public class Base {

     protected String messageFromBase = "Hello World";

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

}

我在同一个包中有一个Neighbor类:

package package1;

public class Neighbour {

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

然后我在另一个包中有一个子类,它从package1继承Base:

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

    }


}

我的问题是没有从子实例调用display()方法。此外,base1.messageFromBase虽然被声明为受保护,但无法访问。

2 个答案:

答案 0 :(得分:7)

请注意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 

它们只能通过包外的继承来调用。您不必创建基类对象然后调用,只需调用display()

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

专家Makoto在他提供的答案中提供了正式文件的链接。

答案 1 :(得分:1)

当您尝试调用受保护的方法并访问受保护的字段时,您正在使用类,而不是类。由于您位于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);

    }
}