1

私は明らかにこれで明白なことを見逃していますが、与えられました:

package a;
public class Class1 {
    protected int a=1;
}

package b;
import a.*;

public class Class2 extends Class1 {
    Class2() {
        Class1 c1=new Class1();
        Class2 c2=new Class2();
        System.out.println(a);     //1
        System.out.println(c1.a);  //2
        System.out.println(c2.a);  //3
    }
}

//1 は継承によって使用されているため問題なく、//2 は継承によってアクセスされていないために失敗することはわかっていますが、なぜ //3 も問題ないのでしょうか? 変数 a は新しいオブジェクトを介してアクセスされており、a は Class1 に存在すると思いましたか?

ありがとう。

4

4 に答える 4

4

Class2is-aのオブジェクトはすべて、スコープ、およびを使用してのClass1すべてのメンバー変数にアクセスできます。 Class 1defaultprotectedpublic

さらに、スコープ/継承を操作するために使用しているクラスのオブジェクトを操作してスコープと継承のルールを理解しようとすることは、サードパーティ(サードパーティ)とは異なる方法で機能するため、お勧めできません。最も一般的な使用法。)

たとえば、これは許可されています。

public class Something {
   private int something;

   public int stealSomething(final Something otherthing) {
       return otherthing.something;
   }
} 

テストに使用しているクラスの階層にない3番目のクラスを作成してみてください。

于 2013-02-18T20:17:46.577 に答える
4

クラス内でオブジェクトを操作している場合、プライベート属性を含むすべての属性に完全にアクセスできます。c2のインスタンスでClass2あり、コード内で操作しているため、Class2保護された属性が表示されます。

于 2013-02-18T20:18:27.673 に答える
3

// 3も大丈夫なのはなぜですか?

そして、なぜそれは大丈夫ではないのですか?それClass2がのサブクラスであるとするとClass1、のprotectedフィールドはClass1のインスタンスを介してアクセスできますClass2。そして、それはあなたがここでしていることです。c2はのインスタンスでありClass2aフィールドが表示されます。

注:保護されたメンバーは、同じパッケージであろうと異なるパッケージであろうと、任意の直接サブクラスにアクセスできます。

変数aが新しいオブジェクトを介してアクセスされていると思いました

ええ、それは本当です。

とクラス1に存在しますか?

ここではそれは本当に問題ではありません。インスタンスにaアクセスできる限り、それは有効です。Class2

そして参考までに、あなたのコードはで死んでしまいますStackOverflowError。あなたはそれの世話をする必要があります。

于 2013-02-18T20:18:11.803 に答える
1

問題がわかりません。

Class1には「a」という名前の変数があります。'保護されている'ため、その変数は、Class1のすべてのオブジェクトおよびClass1を拡張するクラスのすべてのオブジェクト内に表示されます。

'a'がプライベートの場合、Class1を拡張するクラスのオブジェクトではこのように表示されません。

于 2013-02-18T20:18:02.277 に答える