2013-12-12 7 views
6
abstract class A { 
    private int a; 
    public A(int x) { 
     a = x; 
    } 
    public int getA() { 
     return a; 
    } 
} 

class B extends A { 
    public B(int x) { 
     super(x); 
    } 
} 

class TestB { 
    public static void main(String args[]) { 
     B b = new B(5); 
     System.out.println(b.getA()); 
    } 
} 

私はB b=new B(5);を言うとき、スーパークラスのコンストラクタが呼び出され、プライベートインスタンス変数iがbによってreffered class BのオブジェクトにgetA()を言うときだから、返し5に初期化されます。インスタンス変数aclass Aであるため、class Bに継承されません。インスタンス変数aはどこに作成されますか(ヒープ上)。 publicだったら、ヒープ上のclass Bインスタンスの一部だったはずです。またclass Aはabstarctクラスなので、インスタンス化することはできません。ヒープで作成された抽象クラスのプライベートインスタンス変数はどこにありますか?この状況で

+1

"クラスAのインスタンス変数aはプライベートなので、クラスBに継承されません。" - 間違っていますが、もちろん継承されています! 'getA()'メソッド以外はアクセスできない。 –

答えて

6

インスタンス変数は、彼らが抽象スーパークラスから、スーパークラスから、パブリック、プライベートであれば

は、典型的には、配列が

  1. ようになりますに関係なく、割り当てられている違いはありませんObjectインスタンス変数のB.classオブジェクト
  2. ブロックへの参照(GC、同期のためのモニターのためのヘルパーフィールドを含む、...)
  3. A Iのブロック(のみaこの場合)nstance変数
  4. ブロックBのインスタンス変数(この場合はなし)

しかし、JVMの各実装は、それが割り当てる方法を選択する自由であるそれらの各

とコンパイラとJVMの両方によってアクセス制御が強制されます

+0

したがって、クラスBのオブジェクトがヒープ上に作成されると、オブジェクトクラス、クラスAおよびクラスBのすべてのインスタンス変数を持ちます。 – Pankaj

+0

@Pankajはい、もう一度それを行う一般的な方法ですが、別のブロックを割り当て、それらをリンクされたリストのようにリンクするなどの他の方法がありますが、もう1つは速いです –

0

すべての要約は、「このクラスを独自に作成することはできません」と言います。クラス内で定義されたすべては、非抽象クラスと全く同じ働きをします。

つまり、上記の「抽象」キーワードを削除すると、コンパイルされたバイトコードはほぼ同じに見えます。

クラスの動作を変更し、クラスの動作は変更しません。

+0

抽象クラスのインスタンスを作成することはできないので、抽象クラスのプライベートフィールドはどこにあるのか?抽象クラスはヒープ内のメモリに割り当てられていますか? – cnova

+1

抽象クラスを拡張する具象クラスを作成すると、その抽象クラスのメンバーは、その抽象クラスのインスタンス化の一部として、抽象クラス以外のクラスとまったく同じように作成/割り当て/割り当てられます。 –

0

継承の基本ルール!!!

oracle documentationからサブクラスは、その親クラスのプライベートメンバーを継承しません。ただし、スーパークラスにプライベートフィールドにアクセスするためのパブリックメソッドまたはプロテクトメソッドがある場合、サブクラスでもスーパークラスを使用できます。

3

変数 'a'のインスタンスは、クラス 'B'のオブジェクトのヒープ内に作成されます。インスタンス 'a'が公開されているクラス 'B'のオブジェクトの内部に作成されます。

サブクラスのオブジェクトには、スーパークラスのプライベートフィールドが含まれている必要があります。私的なメンバーにアクセスできないということは、そこにないことを意味するものではありません。

JLSとしてください。

プライベートとして宣言されているクラスのメンバーは、そのクラスのサブクラス によって継承されません。クラス が宣言されているパッケージ以外のパッケージ で宣言されたサブクラスによって継承されるのは、 プロテクトまたはパブリックです。

サブクラスは、スーパークラスのプライベートフィールドではありません。サブクラスのOBJECTSには、スーパークラスのプライベートフィールドが含まれています。サブクラス自体には、そのスーパークラスのプライベートフィールドのNOTIONはありません。

+0

+1。 Unche mits。 :-) –

関連する問題