12

基本クラス:

public class Inheritance {
    int i;
    Inheritance() {
        System.out.println("I am in base class" + i);
    }
}

派生クラス:

public class TestInheritance extends Inheritance {

    TestInheritance() {
        System.out.println("I am in derived class");
    }

    public static void main(String[] args) {
        TestInheritance obj = new TestInheritance();        
    }
}

これは、上記で起こっていることについて私が念頭に置いていることです。

デフォルトで派生クラスのオブジェクトを作成するsuper()と、基本クラスのコンストラクターが呼び出され、変数が初期化されますi

さて、私の質問は次のとおりです。この場合のコンストラクターは変数iを初期化するだけで、クラスの具体的なオブジェクトを作成しませんか?

これまで読んだことから、作成されたオブジェクトは1つだけです-i変数を持つ派生クラスのオブジェクトです。

しかし、基本クラスのコンストラクターが呼び出された時点から、派生クラスのコンストラクターが呼び出された時点から、どのように/どこiにメモリに格納されますか?

そして、基本クラスが抽象クラスの場合はどうなるでしょうか。

さまざまな時点でメモリ内で何が起こっているかを知ることができれば、本当に感謝しています。

根本的に間違っていることを言っている場合は、お知らせください。これがどのように機能するかを本当に知りたいです。

4

2 に答える 2

2

これは、継承をめぐる混乱の一般的な領域だと思います。オブジェクトが 1 つしか作成されないことは理解できたようですね。そのとおりです。

基本クラスのインスタンス変数は、スーパークラスからもアクセスできるように、基本クラスのパブリック メソッドや保護されたメソッドに含まれていると考えることをお勧めします。

オブジェクトがインスタンス化されると、Java ランタイムは、ストレージが必要なすべてのもの (主にインスタンス変数) にストレージを割り当てるために必要なことを行います。したがって、基本クラスのインスタンス変数は、サブクラスまたはスーパークラスで宣言されているかどうかにかかわらず、オブジェクトのすべてのインスタンス変数を含むメモリ ブロックの一部と考えることができます。

そして、用語の修正の 1 つ: あなたのコードでは、変数は明示的に「初期化」されていません。つまり、「割り当て」、つまり、変数がメモリ内にスペースを持っているのはどの時点かということだと思います。「初期化」は、変数に値が与えられたことを意味します。Java は変数にデフォルト値を割り当てるのに非常に優れていますが、この場合は割り当てを行う必要があると思います。

于 2013-08-22T22:43:43.590 に答える