質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

Q&A

解決済

2回答

672閲覧

インスタンス変数に代入するためのthisの使い分けがわからない

kawase

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

0グッド

1クリップ

投稿2022/10/12 07:48

前提

初めて質問させていただきます。
書式などに不備などございましたら申し訳ございません。

Javaを理解するために「Tech PROjin」様のサイトを利用して勉強をしているのですが、わからない箇所がありましたため質問させていただきます。
以下の
「1.」に記載したコードでは
インスタンス変数に代入するためのthis.name = name
が不要であるのに対して
Javaの勉強をしているのですが、「2.」に記載したコードでは
インスタンス変数に代入するためにはthis.name = name
が必要であると記載されていました。
thisをつける場合とつけない場合の違いが判りません。
なぜ「1.」のコードでは「this」をつけなくても「null」にならず、「2.」は「this」をつけないと「null」になるのでしょうか。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • nullになる場合とならない場合の違いが知りたい。

該当のソースコード

Java

11. 2 3public class Sample { 4 public static void main(String[] args) { 5 Dog pochi = new Dog("ポチ"); 6 System.out.println(pochi.name); 7 } 8} 9 10class Dog { 11 String name; 12 Dog(String n) { 13 name = n; 14 } 15} 16 172. 18 19public class Sample { 20 public static void main(String[] args) { 21 Dog dog = new Dog("ポチ"); 22 System.out.println(dog.name); 23 } 24} 25 26class Dog { 27 String name; 28 29 public Dog(String name) { 30 name = name; 31 } 32}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

変数名(だけ)を書いたときは、一番近い定義の変数を指します

public Dog(String name) { name = name; }

のときのnameは、Dogの引数のnameを指してしまいます
きっちりインスタンス変数の方を指したいのなら、そのように記述する必要があります

投稿2022/10/12 09:27

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawase

2022/10/13 00:32

ご回答ありがとうございます。 「1.」で記載したコードでは同じ名前の変数「name」に「name」を代入していましたが、「2.」では「name」に「n」を代入しているため ローカル変数であるDogの引数のnameを指しているということでしょうか。 そしてDogの引数のnameについてはreturn が記述されていないため、返す値がないので値がないため以下のように記述すると「null」になってしまうということでしょうか。 System.out.println(dog.name);
y_waiwai

2022/10/13 03:36

> そしてDogの引数のnameについてはreturn が記述されていないため、返す値がないので値がないため以下のように記述すると「null」になってしまうということでしょうか。 これは違います。 インスタンス変数の方にはなにも代入されてません インスタンス変数の方に代入したいってことなら、this.name=name としましょう name=name では、(双方とも)一番近い定義、Dogの引数のnameを指します。 繰り返しますが、インスタンス変数の方には代入されません
guest

0

ベストアンサー

name = name は、引数のnameに引数のnameを代入するだけで、何もしないのと同じこと。
引数のnameとインスタンスのnameが同じ名前で、ローカル変数であるnameが優先されます。
名前が違えばどこの変数が使われるか明確になります。

java

1class Dog { 2 String name; // インスタンス変数 name、初期値は null 3 Dog(String n) { // ローカル変数 n 4 name = n; // インスタンス変数 name に ローカル変数 n を代入 5 } 6}

java

1class Dog { 2 String name; // インスタンス変数 name、初期値は null 3 Dog(String name) { // ローカル変数 name 4 name = name; // ローカル変数 name に ローカル変数 name を代入、インスタンス変数 name は変化なし 5 } 6}

投稿2022/10/12 09:06

編集2022/10/13 07:32
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawase

2022/10/13 00:48

ご回答ありがとうございます。 「name = n;」でしたら、ローカル変数が使われずにインスタンス変数の方が呼び出されるということでしょうか。
shiracamus

2022/10/13 00:51

そうです。 変数名は ローカル変数 → インスタンス変数 → クラス変数 → 親クラスのクラス変数 → 親の親... と探索されていきます。
kawase

2022/10/13 02:37

ありがとうございます。 そうしましたら Dog dog = new Dog("ポチ"); というのはインスタンス変数の「name」に値を代入する処理であり、 System.out.println(dog.name); の「(dog.name)」というのは 「1.」ではインスタンス変数に代入した値を呼び出す。 「2.」ではローカル変数に代入した値を呼び出す。 処理なので、「1.」のみインスタンスで代入した値が表示されるという認識でよろしいでしょうか。
shiracamus

2022/10/13 03:50

1. はそのとおりです。 2. もインスタンス変数を表示してますが、インスタンス変数に代入されていないので null が表示されます。
kawase

2022/10/13 07:01 編集

ありがとうございます。 1.Dog pochi = new Dog("ポチ"); 2.Dog dog = new Dog("ポチ"); にて 引数を持つコンストラクタを指定していますが、これはインスタンス変数に値を代入する処理であるため、 2.の場合も1.と同様にインスタンス変数を表示しているが、2.はインスタンス変数に値が代入されていないので null が表示さるということでしょうか。
shiracamus

2022/10/13 07:33

コメント付コードを追記しました。
kawase

2022/10/14 00:15

わかりやすくコメント付きコードを作成していただきありがとうございました。 理解することができました。 ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問