tqwko_05
@tqwko_05

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Javaにおけるインスタンスの生成時の左辺

解決したいこと

hogeResultDto = new HogeDto();

Javaのコードを読んでおり、Actionクラスの中に上記のような記述がありました。
Dtoクラスをnewしているのでインスタンスを生成しているのかな、と思いましたが変数名の記載が無くあれ?となりました。
本来であれば

HogeResultDto hogeResultDto = new HogeDto();

としてクラス名から指定して、変数(hogeResultDto)を操作していくと思ったのですが…
ちなみに調査していたら以下のように、このクラスは親クラスを継承しており、そこにフィールドとして以下のように変数が宣言されていました。

protected HogeDto hogeReultDto;

これは、インスタンスを作成するクラスが親クラスを持っており、そこに変数が宣言されていればクラス名の記述は省略してよい、ということなのでしょうか?
インスタンスを学んだばかりで混乱しています。どなたかお助けください。。

※参考※

Actionクラス(子)

public class HogeAction extends HogeBaseAction {

---中略---
//hogeDTOを宣言
hogeResultDto = new HogeDto();

}

BaseActionクラス(親)

public class HogeBaseAction extends ModelDrivenAction<SearchConditionForm> {

---中略---
//
protected HogeDto hogeReultDto;

}
0

2Answer

まず継承のことは抜きにして、
hogeResultDto = new HogeDto();hogeResultDtoはインスタンスフィールドです。
通常、アクセスする際はthis.hogeResultDtoのようにアクセスしますが、同じ名前の引数やローカル変数がなければthis.を省略可能です。

下記に単純な例を載せます。

class Sample {
    protected String text = "サンプル";
    
    void printText(){
        // インスタンスフィールドの参照
        System.out.println(this.text); // => "サンプル"

        // thisは省略可能。上と同じ。
        System.out.println(text); // => "サンプル"

        // 代入する時も同様
        this.text = "サンプル2";
        System.out.println(this.text); // => "サンプル2"

        text = "サンプル3";
        System.out.println(text); // => "サンプル3"
    }
}

次に継承ですが、
子クラスは親クラスの特性を全て受け継ぎます。
そのため子クラスにhogeResultDtoフィールドの記述がないだけで、子クラスはhogeResultDtoフィールドを持っています。

下記に子クラスにて親クラスで定義されたフィールドを扱う例を載せます。

class ExtendSample extends Sample{
    private Integer number = 1;

    void printTextAndNumber(){
        // Sampleを継承しているため、ExtendSampleはtextフィールドを持っている
        System.out.println(this.text);

        // 子クラスが独自に宣言したフィールド
        System.out.println(this.number);

        // 継承しても同様にthisは省略可能
        System.out.println(text);
        System.out.println(number);
    }
}

また余談ですが、親クラスにてアクセス修飾子がprivateで定義されているフィールドやメソッドに関しては子クラスから直接アクセスすることができません。
(アクセスできないだけで子クラスのインスタンス内にも存在はしています。)

2Like

インスタンス変数です。
宣言時に初期化していないので別のタイミングでインスタンス化しています。
クラス名を省略しているのではなくすでに宣言してある変数にインスタンスを渡しています。
スコープがprotectedなのでサブクラスからアクセスできます。

インスタンス化に関しては下記の資料等はどうでしょうか?
http://msugai.fc2web.com/java/instance.html

1Like

Your answer might help someone💌