为什么我不能以这种方式访问​​Java中的受保护变量?

时间:2016-05-21 11:45:39

标签: java protected

我用这种方式定义了一个类:

package prueba;

public class OtraClase {

[...]

protected int num3;

[...]

另一个课程以这种方式定义:

package otro;

import prueba.*;

public class OtraClaseMas extends OtraClase{

但如果在最后一节课中我创建了一个OtraClase对象,我不能做这样的事情:

createdObjectOfOtraClase.num3=1;

我认为根据我应该能够提供的文件here。它表示protected修饰符允许其类的子类在另一个包中进行访问。而且,就我所看到的而言,我并不认为它是另一个东西,而不是另一个包中它的类的子类。

我误解了什么吗?

编辑:我要么使用该类的构造函数,要么使用另一个不同的函数,并且它不会在任何地方都不起作用。

构造函数的代码:

public OtraClaseMas(int num, int num2,int num3)
{
    super(num, num2,num3);      
    OtraClase oc=new OtraClase(1,1,1);
   //oc.num3=1; This doesn't work
}

方法代码:

public void foo()
{
    OtraClase oc=new OtraClase(1,1,1);
    //oc.num3=1; This doesn't work

}

4 个答案:

答案 0 :(得分:5)

protected变量可以从同一个包或派生类访问,就像它们访问自己的成员一样,但是如果你在超类的包外面创建超类的实例,那么你即使您正在扩展同一个超类

,也无法访问它
package packageA;
public class ClassA {
    protected int variableA;
}

package packageA;
public class ClassC {
    public void setVariableA() {
        ClassA classA = new ClassA();
        classA.variableA = 1; // OK
    }
}

package packageB;
public class ClassB extends ClassA {
    public void setVariableA() {
        ClassA classA = new ClassA();
        variableA = 1; // OK
        classA.variableA = 1;// this wont work
    }
}

答案 1 :(得分:2)

关于受保护的类:

最简单的答案是,您要扩展的 基类(SuperClass) 存在于其自己的程序包中(例如,在火星上的卧室中),保护区(假设是激光枪)。

当您通过继承(即扩展)到不同的程序包和类(例如,地球上的办公室)来实现此类时,您将在地球上存在的受保护门户中创建从地球到火星到激光枪的门户。仅办公室,只有此门户网站才能为您提供帮助。

因此,地球上的外星人卧室(新包装中的基类)不知道,也无法将您引向激光枪,因为他们没有办公室的门户,因此您不能要求他们给您介绍激光枪。但是您可以要求办公室以及任何可以创建办公室门户的地方作为参考。

所以现在您有了枪,可以皮尤了! ew!

注意:如果您使用的是同一软件包,则不需要门户(私有/默认软件包)

答案 2 :(得分:0)

您确定要正确初始化对象吗,因为以下内容非常正常

public class A {
    protected int x;
}


public class B extends A{

}




public class Test {
    public static void main(String[] args) {
        A a= new A();

        a.x=0;

        B b=new B();
        b.x=1;

        A c=new B();

        c.x=2;
        }    
}

答案 3 :(得分:0)

所以问题是,如果您想访问父级protected变量,则无法使用引用(正如您在foo()中尝试的那样OtraClaseMas())。试图说明的是,如果需要,可以直接将变量用作类变量,如下所示 -

package otro;
import prueba.*;

public class OtraClaseMas extends OtraClase{
    public void foo()
    {
        OtraClase oc=new OtraClase(1,1,1);
        //oc.num3=1; This doesn't work
        num3 = 1; //  this works!
    }
}

但是,如果引用是在与父类相同的包中创建的(在您的情况下为prueba),则可以访问protected变量。