インスタンスを作る
Ticket t; と書いた時点では、チケットはまだ 1 枚もありません。この行が用意したのは、チケットを指すための変数だけです。そのまま t.seat に触ると NullPointerException で止まります。設計図を書いたことと、実体があることは別の話です。
new は、その場で 1 つ作る命令
実体を生み出すのは new です。
Java
Ticket t; // 指す先がまだ無い。t は null
t = new Ticket(); // ここで実体が 1 つ生まれ、t がそれを指す
t.seat = "A-12";new Ticket() がやっているのは 2 つです。Ticket が持つべきフィールドの分だけ置き場所を確保し、そこを指す情報を返します。返ってきた情報を変数に入れておくから、あとから t.seat で辿り着けます。
いつも書いている Ticket t = new Ticket(); は、この 2 行を 1 行にまとめた形です。実際の開発でもほとんどの場面でこちらを使います。
new を書いた回数だけ増える
new は、書くたびにまったく新しい実体を作ります。
Java
Ticket a = new Ticket();
Ticket b = new Ticket();
System.out.println(a == b); // falsea と b は別の場所を指しているので、== で比べても false です。フィールドに同じ値を入れても結果は変わりません。== はオブジェクトに対しては、中身が同じかではなく、同じ実体かを聞く演算子だからです。
変数が握っているのは、実体そのものではない
ここが new の山場です。変数に入っているのは実体のコピーではなく、実体の置き場所を指す矢印です。だから = で別の変数に渡しても、実体は増えません。
Java
Ticket a = new Ticket();
a.seat = "A-12";
Ticket c = a; // 矢印が 1 本増えただけ
c.seat = "B-3";
System.out.println(a.seat); // B-3。触っていない a も変わっているnew を書いていないので、実体は最初の 1 つのままです。a と c はその 1 つを両側から指しているだけなので、どちらから書き換えても同じものが変わります。実体を 2 つにしたいなら、new をもう 1 回書くしかありません。
やってみよう
instantiateAndGet() は、自分で定義した型から実体を 1 つ作り、その実体のメソッドを呼んだ結果を返します。
Solutionの中にstatic classで型を 1 つ定義します。フィールドは要りません- その型に、
Stringを返すメソッドを 1 つ持たせます。返す文字列は課題の要件のとおりです instantiateAndGet()の中でnewを書き、返ってきた実体からメソッドを呼びます- 文字列をそのまま
returnしても表示は合いますが、newが 1 度も走っていません
要件
Solutionクラスの中にBookクラスをネストで定義すること (static class Book推奨)Bookクラスにread()のような戻り値がStringのメソッドを持たせ、"Hello, Object!"を返すことinstantiateAndGet()の中でnew Book()でインスタンスを作り、その戻り値をreturnで返すこと
入出力例
instantiateAndGet() → "Hello, Object!"