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

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

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

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

コンストラクタ

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

Q&A

解決済

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

kawase
kawase

総合スコア1

Java

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

コンストラクタ

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

2回答

0グッド

1クリップ

398閲覧

投稿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}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/10/12 12:08

こちらの質問が他のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。

回答2

0

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

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

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

投稿2022/10/12 09:27

y_waiwai

総合スコア86066

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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を指します。 繰り返しますが、インスタンス変数の方には代入されません

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

総合スコア5394

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

コンストラクタ

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