【问题标题】:Why protected scope is not working?为什么受保护的范围不起作用?
【发布时间】:2015-07-05 11:52:30
【问题描述】:

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

我在 package1 中有一个基类:

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 虽然被声明为受保护,但不可访问。

【问题讨论】:

    标签: java protected


    【解决方案1】:

    注意一些关于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 在他提供的答案中提供了官方文档的链接。

    【讨论】:

    • class Child extends Base (那里提到了继承)。和孩子躺在单独的包装中
    • 你已经继承了display方法,你只需要使用它或者Override it
    • @MurtazaKhursheedHussain:在这种情况下,重写它不是一个好主意,因为这意味着您正在篡改父方法的行为。这可能不是这里的意图。
    • 我知道,这就是我试图解释的,所有可能的行为
    【解决方案2】:

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

    【讨论】:

    • 方法也不能通过以下关系访问 Base base1 = new Child();
    • @Orion:我没想到会这样。在您无法看到Base 的受保护类的上下文中,您将Child 的实例称为Base 的实例。
    • 在引用类型上调用方法。在这里,您可以参考 Base 类。编译器认为你想使用对象调用受保护的方法
    猜你喜欢
    • 2015-01-12
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2011-10-02
    相关资源
    最近更新 更多