我在一个不同的包中有一个类,我声明了一个受保护的成员。如图所示
package Pack1;
public class Box {
public Box()
{
System.out.println("Box Class Contructor");
}
protected int x = 1;
protected void Hello1()
{
System.out.println("Hello!!");
}
}
现在我将这个类扩展到另一个包来调用其受保护的成员,如下所示:
public class Main extends Pack1.Box {
public Main()
{
System.out.println("main constructor");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main main = new Main();
main.Hello1(); // not giving me any error
Pack1.Box b = new Pack1.Box();
b.Hello1();//Giving me an error
}
}
我不确定为什么b.Hello1()
在遗传的情况下给我一个错误。但是,如果我将Hello1()
声明为protected static void
,则不会给我一个错误。
答案 0 :(得分:1)
为了访问受保护的方法(),位于其他包中的类的变量我们需要继承。 正如我所看到的,您已经使用了继承并正确地继承了包pack1的类框。
现在除了该类的默认成员和私有成员之外的所有成员都不可见。那些被宣布为受保护和公开的成员可以看到什么。
现在您可以假设这些方法在您的类中可用。 因此,不是通过对象引用方法引用该类将给出错误,而如果直接调用该方法但在类的构造函数(即您的情况下为Main()类)中它不会给您任何错误。 / p>
为什么因为,
静态方法有两个主要限制。
他们是:
1)静态方法不能使用非静态数据成员或直接调用非静态方法。
2)这和super不能在静态环境中使用。
尝试从类构造函数中调用Hello1()方法。它会工作。
答案 1 :(得分:0)
protected
方法Hello1()
在Pack1
中定义,因此您无法从另一个包中调用它 - 只能从subclasses
这样调用:
Main main = new Main();
main.Hello1();
protected允许从子类和同一包中的其他类进行访问。 当你使用静态方法时。
您可能想知道“静态保护方法的原因是什么,考虑到除了来自该类的实例之外的任何地方都无法调用它?”。通常没有太多理由将private或protected方法声明为static。静态方法通常是公开的。