2016-05-21 8 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にできるはずです。 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 

} 
+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

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

ドキュメントはOKですが、問題は、別のパッケージにある派生クラスの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! 
    } 
} 

below-示すように、参照は、親クラスと同じパッケージ(pruebaで作成された場合、あなたは直接、クラス変数として変数を使用することができるということです、あなたの場合)、protected変数にアクセスできます。

関連する問題