2016-05-21 4 views
3

Я класс определяется следующим образом:Почему я не могу получить доступ к защищенной переменной в Java таким образом?

package prueba; 

public class OtraClase { 

[...] 

protected int num3; 

[...] 

И еще один класс определен следующим образом:

package otro; 

import prueba.*; 

public class OtraClaseMas extends OtraClase{ 

Но если в последнем классе я создаю OtraClase объект я не могу сделать что-то вроде этого:

createdObjectOfOtraClase.num3=1; 

И я думаю, что, согласно документации, которую я должен быть в состоянии, here. В нем говорится, что защищенный модификатор позволяет получить доступ подклассом своего класса в другом пакете. И насколько я смотрю на это, я не вижу, чтобы это была другая вещь, а не просто подкласс ее класса в другом пакете.

Я что-то не понимаю?

Редактировать: Я либо использую конструктор класса, либо другую функцию, и он не работает ни в одном месте.

Код для конструктора:

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 

} 
+0

Можете ли вы показать нам, где вызов 'createdObjectOfOtraClase.num3 = 1;'? –

+0

Я не могу воспроизвести проблему. Если вызов 'createdObjectOfOrtaClase.num3 = 1' происходит в' OrtaClaseMas', он должен работать. – Turing85

+0

Вы - случайно, объявили 'num3' как' final'? – Turing85

ответ

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; 
     }  
} 
5

Доступ к переменной A 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 
    } 
} 
+0

Угадайте, что документация java не права тогда ... Приятно знать. Благодарю. – user2638180

+0

документация в порядке, проблема в том, что в производном классе OtroClaseMas, который находится в другом пакете, вы создаете новый экземпляр суперкласса и пытаетесь получить доступ к переменной суперкласса, используя этот новый экземпляр, и это не так. разрешите, проверьте образец кода, который я добавил, надеемся, что он сделает все более понятным для вас – illgoforit

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 в вашем case), тогда будет доступна переменная protected.