@kakedasiE

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の変数について

解決したいこと

Javaにおいて、コンストラクタ作成した際に、メンバ変数へローカル変数を代入する理由を知りたい。

class Main {
    // メンバ変数(インスタンス変数)
    private String name;
    private int age;
    private String sex;

    // クラス変数
    private static int count = 0;

    // コンストラクタ
    public Main(String name, int age, String sex) {
        this.name = name;  
        this.age = age;  ←なぜthis.nameに代入するのか
        this.sex = sex;
        
        System.out.println("コンストラクタ呼び出し");
        System.out.println("名前:" + this.name);
        System.out.println("年齢:" + this.age);  ←ローカル変数(コンストラクタの引数の
        System.out.println("性別:" + this.sex);   ままではない理由
class Main{   これではよくないのでしょうか
    private String name;
    private int age;
    private String sex;

    public Main(String name,int age,String sex){
        System.out.println("名前:" + name);
        System.out.println("年齢:" + age);
        System.out.println("性別:" + sex);
    }
0 likes

5Answer

クラスの一部しか記載がないので、なんとも言えませんが、後者のコードでエラーが出ない/仕様を満たしているのであればそれでいいんじゃないでしょうか。

1Like

コンストラクタは、メンバー変数を初期化する責任があるのではないかと思います。
(生成されたインスタンスのメンバー変数が「不定」では困る)
↓ これでもよいと思います。

class Main { 
    private String name;
    private int age;
    private String sex;

    public Main() {
        this.name = "";
        this.age = 0;
        this.sex = "";
    }
}
1Like

Javaにおいて、コンストラクタ作成した際に、メンバ変数へローカル変数を代入する理由を知りたい。

後々使うからとしか言いようがないので,その辺は適当に流して学習を進めてください.
そもそもコンストラクタ内で引数を即時に活用する機会があるとすればデバッグ出力くらいしかないので,あんまりそこについては深く突っ込まなくていいです.

1Like

Comments

  1. @kakedasiE

    Questioner

    そうですか!ありがとうございます。

質問の意図がよくわからないのでいろいろ書いてみます。

まず、質問にあるコンストラクタで渡された引数の name などは、メンバー変数 name などと同じ名前ですが、言語仕様的には別の変数ですので、自動で値がメンバー変数に設定されたりはしません。 必要であれば明示的に代入しなければなりません。

コンストラクタでメンバー変数に値を入れなければならないかというと、言語仕様的にはそんなことはありません。引数で渡さず、メンバー変数に値を何も入れなくても構いません。コンストラクタでメンバー変数に値を入れるかどうかは、設計で決定する事項ということです。
だだし、そのような設計にすると、メンバー変数はインスタンス毎に違う値を持つ変数ですので、生成されたインスタンスのメンバー変数に値が入っていない状態があるということになり、それを考慮した設計にする必要があります。
値を設定するためのメソッド(setter)が必須になり、値が無い状態でも各メソッドが正常に動くようにする必要があるでしょう。 生成した直後に必ず値を設定しなければならないという規約にする手もありますが、であれば、コンストラクタで設定しない理由がありません。

0Like

「何故わざわざメンバ変数に値を代入するのか」といえば、当然コンストラクタ以外のメソッドから利用するためです。
この例の場合、privateな変数なので、それ以外の用途はあり得ません。

class Main {
    // メンバ変数(インスタンス変数)
    private String name;
    private int age;
    private String sex;

    // クラス変数
    private static int count = 0;

    // コンストラクタ
    public Main(String name, int age, String sex) {
        this.name = name;  
        this.age = age;
        this.sex = sex;
        
        System.out.println("コンストラクタ呼び出し");
        System.out.println("名前:" + this.name);
        System.out.println("年齢:" + this.age);
        System.out.println("性別:" + this.sex);
    }

    /**
     *  名前を返す。
     *  @return 名前
     */
    public String getName() {
        return this.name;  // こんなふうにしたり
    }

    /**
     *  年を経過させる。
     *  @param year 経過させる年数
     */
    public void passYears(int year) {
        this.age += year;  // こんなふうにしたり
    }


    /**
     *  おすすめレストランを返す。
     *  @return おすすめする{@link Restaurant}のインスタンス
     */
    public Restaurant getRecommendedRestaurant() {
        if (this.sex.equals("男")) {  // こんなふうにしたり
            return new Restaurant("ラーメン");
        } else if (this.sex.equals("女")) {
            return new Restaurant("スイーツ");
        }
        return null;
    }
}
0Like

Your answer might help someone💌