Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

コンストラクタの基本

学習サイトprogateのコンストラクタの項目で以下のようなコードがありました
内容は単純にコンストラクタの機能を学習するためのものです

class Person {
  public String name;

  // コンストラクタがString型の引数を受け取るようにしてください
  Person(String name) {
    System.out.println("インスタンスが生成されました");
    // インスタンスフィールドnameに値をセットしてください
    this.name=name;
    
  }

this.name=name;のところが分かりません。同じnameを用いているのですが、
最初にpersonクラスの属性として作ったpublic String nameのnameと、
コンストラクタの引数のString nameはまったくの別物なのでしょうか?
別物ならば、別の引数を宣言したほうが分かりやすいと思うのですが、こういった習慣というか理由があるのでしょうか?

4

回答

89560

閲覧

4件の回答

評価

0

「2つの『String name』は、同じ変数名なのに別の変数なのか、そうだとしたらなぜ別の変数名にしないのか」
ということだろうか…?

前半。引数のString nameはクラスの外に向けてのもの、フィールドのString nameはクラスの内側で使うものだ。
これら(外向けと内側)を、きちんと分けて考える必要がある。

後半。単にそういうクラスだから。
setter同様、外から引数として渡す値がそのまま内側に確保する値になるから、同じ名前にしているだけ。
あえて別の名前にする意味も薄いので。
「外向けと内側」をきちんと認識できるようになれば、『別の名前の方が解りやすい』とは感じなくなると思う。

argNameでもname0何でも、別の名前にしたければしても構わない。
引数の値がそのまま入らない場合は、同名である必要性は低くなるな。

評価

0

質問主です。「内側と外側」と説明を受けて非常にはっきりしました。
フィールドの内側で使われていたnameがthis.nameに入って、クラスから外のクラスに行くイメージがもてました。
ありがとうございます。

評価

30

>フィールドの内側で使われていたnameがthis.nameに入って、クラスから外のクラスに行くイメージがもてました。
…いや、それはちょっとニュアンスが異なる。
外のクラスから「受け取った」nameの値が内側this.name(フィールド)に設定される、という感覚をまず持とう。

フィールドがpublicなので外から見ることもできるが、そこは別の話になる。
サンプルコードとしてあまりよろしくないな…。

評価

0

わかりました。難しいですがイメージをもって学習に励んで見ます
重ねてありがとうございます

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。