无法从其他包访问受保护的方法

时间:2016-01-31 08:28:43

标签: java

我在一个不同的包中有一个类,我声明了一个受保护的成员。如图所示

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,则不会给我一个错误。

2 个答案:

答案 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。静态方法通常是公开的。