1

こんにちは、belows として 1 つの文字列メンバーを含む基本クラスがあります。

public class BaseClass 
{
    public String test;
}

テスト値を初期化する基本クラスを拡張する子クラス。

public class ChildClass extends BaseClass 
{
    public void initialize()
    {
        System.out.println("inside constructor of ChildClass.");
        this.test="stringtest";
    }
}

基本クラスのテスト変数の値を使用したいテストクラス:

public class TestClass extends BaseClass 
{
    public void test() 
    {
        new ChildClass().initialize();
        System.out.println(this.test);
    }
    public static void main(String[] args) {
        new TestClass().test();
    }
}

上記のコードは、テストクラス内で null を出力しています。なんでそうなの?子クラスでテスト変数を初期化しましたが? 私はJavaの概念のどこかで間違っていますか?

4

4 に答える 4

1

BaseClassあなたが投稿した例には2つのインスタンスがあります。1new ChildClass()つは でインスタンス化されたもので、もう 1 つはmain()メソッド ( TestClass) でインスタンス化されたものです。のサブクラスであるそれらのそれぞれBaseClassには、独自のtestメンバーがあります (これらは、異なる値を持つ異なる変数です)。

thisキーワードは、それが使用されているインスタンスを常に参照することに注意してください。

この場合、メソッドで作成されたインスタンスのプロパティにSystem.out.println(this.test);アクセスしています。testTestClassmain

test他のインスタンスのプロパティにアクセスする必要があります。インスタンスへの参照を保持し、後でプロパティにChildClassアクセスすることで、これを行うことができます。test

    ChildClass instance = new ChildClass().initialize();
    System.out.println(instance.test);

次の Java チュートリアル ページが役立つ場合があります: Using the this Keyword

TestClassまた、拡張する必要がまったくないことも考慮してBaseClassください。instance.testメンバーなのでそのままアクセスできpublicますが、フィールドprivateを作ってゲッター、セッターメソッドを用意することを検討してください。これに関する関連情報については、次の質問を参照してください:なぜゲッターとセッターを使用するのですか?

于 2013-09-09T13:17:13.590 に答える
1

問題は、新しいものを作成するChildClassが、変数に設定していないことです。次に、設定されていないものを印刷しますthis.test

あなたがtestメソッドにいるとき、あなたはTestClassインスタンスです:

ここに画像の説明を入力

ChildClassクラスを作成して設定しています

ここに画像の説明を入力

TestClass testしかし、あなたはメンバーを印刷しています

ここに画像の説明を入力

作成ChildClassして使用するだけの場合は、

public class TestClass
{
    public void test() 
    {
        ChildClass cls =new ChildClass().initialize();
        System.out.println(cls.test);
    }
    public static void main(String[] args) {
        new TestClass().test();
    }
}

ChildClassまたは拡張したい場合は

public class TestClass extends BaseClass 
{
    public void test() 
    {
        initialize();
        System.out.println(this.test);
    }
    public static void main(String[] args) {
        new TestClass().test();
    }
}
于 2013-09-09T13:18:39.013 に答える