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

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

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

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

コンストラクタ

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

Q&A

解決済

1回答

1679閲覧

【JAVA】同一クラス内のコンストラクタの呼び出しをJVMに依頼する

momo-3

総合スコア2

Java

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

コンストラクタ

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

0グッド

0クリップ

投稿2021/12/26 08:58

以下のコンストラクタ2と3では、同一クラス内の呼び出しを行っていると思われますが、特に3において、なぜ40がhpで、5がmpとなるのか理解できません。
メソッドの()とは別の考え方で、this(引数);の引数とは、どの引数を示すのでしょうか。
宜しくお願い致します。

public class Boss { String name; int hp; int mp; //コンストラクタ1 public Boss(String name, int hp, int mp){ this.name = name; this.hp = hp; this.mp = mp; } //コンストラクタ2 public Boss(String name, int hp){ this(name, hp, 5); } //コンストラクタ3 public Boss(String name){ this(name, 40); } public Boss(){ } } public class Main3 { public static void main(String[] args) { Boss t1 = new Boss("ガノン", 40, 5); System.out.println(t1.name + "のHPは" + t1.hp + "でMPは" + t1.mp); Boss t2 = new Boss("ガノン", 55); System.out.println(t2.name + "のHPは" + t2.hp + "でMPは" + t2.mp); Boss t3 = new Boss("ガノン"); System.out.println(t3.name + "のHPは" + t3.hp + "でMPは" + t3.mp); Boss t4 = new Boss(); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

それは当たり前です。まずは基礎からやりましょう。基礎が出来ていないからわからないのです。

メソッドの()とは別の考え方で、this(引数);の引数とは、どの引数を示すのでしょうか。

つまり、「this(...)とは何か」ってことですよね? それは「自身のコンストラクタを呼び出している」です。

厳密には this は「オブジェクト自身」を指しています。

普通、オブジェクトを動かす場合、boss1.bark();のように、オブジェクトを指定します。ですがオブジェクト内部で自分自身を指定したい場合もありますよね。たとえば「自分が管理している方のデータ」とか。

その場合、オブジェクト名で指定することになりますが、自分自身なので名前が付けられません。
オブジェクトを使う側と用意する側が同じ人であれば問題なさそうですが、たとえばJavaでいう Swing, AWT, POIというような外部ライブラリも存在します。そうなると自身が持つフィールドを指定したりすることが厳しくなりますね。そこでthisというものが用意されていて、これを『自身が持つ~』という意味として提供されています。

this(...); とやれば、書き方から自分自身が持つコンストラクタだと分かります。なので自分のコンストラクタを呼び出すことになります。

で、

Java

1 Boss t3 = new Boss("ガノン");

としたとき、

まず、引数がString一個だけのやつが呼ばれます。でもそのコンストラクタ内部では、

Java

1 public Boss(String name){ 2 this(name, 40); 3 4 }

となっていますね。name = "ガノン" ( 引数から ) 、それと 整数の 40 を別のコンストラクタに渡しています。(自身の)

つまり (String, int) とかのペアになっているコンストラクタが呼ばれます。
そうすると、public Boss(String name, int hp)が呼ばれるはずです。

このコンストラクタも、

Java

1 public Boss(String name, int hp){ 2 this(name, hp, 5); 3 4 }

となっています。つまりname = "ガノン", hp = 40, ??? = 5 を別のコンストラクタに渡しています。恐らく (String, int, int) のようなやつが呼ばれるはずです。
public Boss(String name, int hp, int mp)ですね。

これも

Java

1 public Boss(String name, int hp, int mp){ 2 this.name = name; 3 this.hp = hp; 4 this.mp = mp; 5 }

となっています。渡されたものを考えるとname = "ガノン", hp = 40, mp = 5となります。
そのまま this.name = name; とかで設定されて終了。

つまり、

this.name = "ガノン", this.hp = 40, this.mp = 5 となります。

必ずしもこんな風に使わないといけないわけではありません。

ただ、他の言語でいうデフォルト引数と呼ばれるような、hpやmpはデフォでいいや…みたいなこともあり得ます。その場合、毎回指定するのは面倒ですし、コンストラクタ内部での処理が多い場合もあります。それをコンストラクタごとに同じ処理を書くのは面倒ですから、this(...)みたいに自身の別のコンストラクタに渡しているだけです。

投稿2021/12/26 09:55

BeatStar

総合スコア4958

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

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

momo-3

2021/12/26 12:50

BeatStar様。 基本的なことにも関わらず、詳細に教えて下さって、本当にありがとうございます! thisは、自分自身を呼び出す時に使う、ということは本での知識はあったものの、何故、そういう表記をする必要があるのか、という理解がありませんでした。 外部ライブラリも、初耳でしたので、thisの存在意義も考えながら、調べてみようと思います。 this(引数)も、引数と書いてある以上、メソッドの仮引数、実引数と同じ考え方なのですね。 オブジェクト指向言語については、まだ勉強を始めたばかりで、基本的な構文のひとつを覚えるのに精一杯なのですが、今後、同じことをするために、色々な書き方が出てくることを、意識しようと思います。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問