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

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

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

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

Q&A

解決済

3回答

1789閲覧

Java言語においてコンストラクタで引数を受け取る際の属性定義について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2019/03/03 00:36

質問内容

現在スッキリわかるJava入門という本でJavaを勉強しています。
オブジェクト指向の単元である「コンストラクタで因数を追加情報として受け取る」で躓きました。
下記のコードを打ち込むとname がフィールではないというエラーが発生しました。
なので、フィールドにString name; を追加したらエラーは出なくなりました。

しかし、なぜString nameが必要なのか分かりません。
ミナトが引数として下記のnameに代入されるので、記載する必要はないと思いました。
なぜnameをフィールドに記述しないといけないのか教えてください。

Hero(String name) { this.hp = 100; this.name = name; } }

最初に試してみたソースコード

メインクラス

public class Main { public static void main(String[] args) { Hero h = new Hero("ミナト"); System.out.println(h.hp); System.out.println(h.name); } }

Heroクラス

public class Hero { int hp; Hero(String name) { this.hp = 100; this.name = name; } }

その後試したコード

メインクラス

public

1 public static void main(String[] args) { 2 Hero h = new Hero("ミナト"); 3 4 System.out.println(h.hp); 5 System.out.println(h.name); 6 } 7} 8コード

Heroクラス

public class Hero { String name; //この部分を追加 int hp; Hero(String name) { this.hp = 100; this.name = name; } } コード

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/03/03 00:44

つ 言語仕様
退会済みユーザー

退会済みユーザー

2019/03/03 01:53

回答ありがとうございます。 まだ、Javaしか使ったことがないですが、多言語と違いJavaではこのように記述しないといけないと言うことですね。
guest

回答3

0

なにを疑問に持ってるのか理解できないですが、

this.name = name;

ここで、this.nameが存在していなかったらエラーが出るのは当然です。
あなたにとって、このnameはどこに格納されるつもりだったんでしょうか

#ああ、pythonあたりと混同してたとか?

投稿2019/03/03 00:50

編集2019/03/03 00:52
y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2019/03/03 02:02 編集

回答ありがとうございます。 thisが指している場所について、詳しく理解していませんでした。 お陰様で理解することができました。 ありがとうございました!
y_waiwai

2019/03/03 02:06

クラス内でnameを定義している時(後の方で提示してるコード)、単にname とだけしていると、引数のnameだと判断されています。 なので、this.nameとして、自クラス内のname変数、と指定しています コンストラクタに限定せず、他のクラスメソッド内でも事情は一緒です そのメソッド内で、nameという変数がない場合は、たんにnameと記述しても、クラス変数を指してくれます
退会済みユーザー

退会済みユーザー

2019/03/03 02:16

引数のnameとクラス内のnameが同じだからthis.をつけて いるんですね。試しにthisを取るためにクラス内のnameをtestにし、 重複しないようにしてその他のコードも修正して見たところ、無事動きました。 thisについて理解することができました。追記でのコメントありがとうございます。
guest

0

java

1public class Hero { //thisというのはHeroの事 2 3 String name; //この部分を追加 4 int hp; 5 6 Hero(String name) { 7 this.hp = 100; //なのでthis.hpとはint hp; 8 this.name = name; //this.nameはString name; 9 //nameはコンストラクタHero(String name)の引数のname 10 //よって意味が無いがname = name;は、Hero(String name)の 11               //nameからHero(String name)へ代入という事になる。 12                13 } 14}

迷うなら名前を変えた方がいいかもね。
System.out.println(h.name);のh.nameは、Heroクラスをインスタンス化したhのフィールドString name;を指す。
Hero(String name)のnameは{}の中でしか使えず、h.nameとしては呼び出せません。

投稿2019/03/03 01:43

編集2019/03/03 01:55
shinami

総合スコア334

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

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

退会済みユーザー

退会済みユーザー

2019/03/03 01:59

回答ありがとうございます。 "h.nameは、Heroクラスをインスタンス化したhのフィールドString name;を指す。"という一文で理解することができました!
guest

0

ベストアンサー

関数の引数は、その関数内でのみ使用できるローカル変数です。
コンストラクタであっても同じです。

this.[変数名] が指すのは、フィールドとして定義した変数です。
最初のHeroクラスではint hp;がフィールドとして定義されているので
this.hp = 100;と代入することができますが、
nameはないのでthis.name = name;としたところで入れる先がありません。

繰り返しになりますが、コンストラクタの引数はフィールドではないので、this.[変数名] で呼び出せません。

投稿2019/03/03 00:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/03/03 01:42

回答ありがとうございます。 回答を読ませて頂いたのですが、こうゆうことでしょうか? this.name=nameを記述しているのは、 フィールドとして定義している変数name(左辺)に代入したいから。 なぜなら、ローカル変数name(右辺)はコンストラクタ内 [=この場合Hero()メソッド] でしか使用できないから。
退会済みユーザー

退会済みユーザー

2019/03/03 01:53

そういうことになります。
退会済みユーザー

退会済みユーザー

2019/03/03 02:01

ローカル変数についての説明が分かりやすく、 お陰様で理解することができました。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問