我正在尝试使用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
虽然被声明为受保护,但无法访问。
答案 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
内,未使用Child
和not 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);
}
}