練習問題 解答
6.5 練習問題 解答
問1
① ○
② ○
③ ×:クラスメンバはオブジェクト共通の情報なのでアクセスは可能です。
④ ×:クラスメンバはクラス自身に関連付けられるため、オブジェクトには関連付けられない。
⑤ ×:クラスメンバはクラスに実体として定義される。
問2
① クラスメソッドからインスタンス変数にアクセスしている。
② クラス変数に「this」キーワードをつけている。
③ 引数なしのコンストラクタが定義されていないのに、オブジェクト生成時に引数を与えていない。
④ 「オブジェクト名.クラスメソッド名」でクラスメソッドにアクセスしている。
※コンパイルエラーにはなりませんが、クラスメソッドにアクセスする場合は「クラス名.クラスメソッド名」と記述するのが一般的です。
問3
Book1.java
package jp.co.f1.basic.ch06exercise;
public class Book1 {
private static int count = 0; // オブジェクト生成回数
private String title; // 書籍名
private int price; // 書籍価格
private int number; // 生成番号
// コンストラクタ
public Book1(String title, int price) {
++count; // オブジェクト生成毎にカウントアップ
this.title = title;
this.price = price;
this.number = count; // 現在の生成回数を番号に格納
}
}
問4
Book2.java
package jp.co.f1.basic.ch06exercise;
public class Book2 {
private static int count = 0; // オブジェクト生成回数
private String title; // 書籍名
private int price; // 書籍価格
private int number; // 生成番号
// コンストラクタ
public Book2(String title, int price) {
++count; // オブジェクト生成毎にカウントアップ
this.title = title;
this.price = price;
this.number = count; // 現在の生成回数を番号に格納
}
// 書籍情報表示メソッド
public void showBook() {
System.out.println("この本のタイトルは" + this.title + "、価格は" + this.price
+ "です。");
System.out.println("生成番号は" + this.number + "です。");
}
// オブジェクト生成回数取得メソッド
public static int getCount() {
return count;
}
}
問5
Practice0602.java
package jp.co.f1.basic.ch06exercise;
import java.util.Scanner;
class Book3 {
private static int count = 0; // オブジェクト生成回数
private String title; // 書籍名
private int price; // 書籍価格
private int number; // 生成番号
// コンストラクタ
public Book3(String title, int price) {
++count; // オブジェクト生成毎にカウントアップ
this.title = title;
this.price = price;
this.number = count; // 現在の生成回数を番号に格納
}
// 書籍情報表示メソッド
public void showBook() {
System.out.println("この本のタイトルは" + this.title + "、価格は" + this.price
+ "です。");
System.out.println("生成番号は" + this.number + "です。");
}
// オブジェクト生成回数取得メソッド
public static int getCount() {
return count;
}
}
public class Practice0602 {
public static void main(String[] args) {
// ①スキャナークラスをオブジェクト化
Scanner sin = new Scanner(System.in);
// ②3回ループ処理
for (int i = 0; i < 3; i++) {
// ③タイトルを入力
System.out.print("本のタイトルを入力してください->");
String title = sin.next();
// ④価格を入力
System.out.print("本の価格を入力してください->");
int price = sin.nextInt();
// ⑤キーボード入力から値を引数にオブジェクト生成
Book3 book = new Book3(title, price);
// ⑥書籍情報を表示
book.showBook();
// 改行する
System.out.println();
}
// ⑦オブジェクト生成回数を表示
System.out.println("■本の生成回数は「" + Book3.getCount() + "」回です。");
}
}
解説
① new演算子を用いてScannerクラスをオブジェクト化します。
Scanner sin = new Scanner(System.in);
② for文を用いて3回ループさせます。
for(int i=0;i<3;i++)
③ Scannerクラスnextメソッドを利用して文字列を入力し、変数titleに格納します。
String title = sin.next();
④ ScannerクラスnextIntメソッドを利用して整数を入力し、変数priceに格納します。
int price = sin.nextInt();
⑤ ③と④の値を引数にBook3オブジェクトを生成します。
Book3 book = new Book3(title, price);
⑥Book3オブジェクトのshowBookメソッドを呼び出し、書籍情報を画面に出力します。
book.showBook();
⑦Book3のクラスメソッドであるgetCountメソッドを呼び出し、オブジェクト総生成回数を画面に出力します。
System.out.println("■本の生成回数は「" + Book3.getCount() + "」回です。");
(③の補足)
next()でなくnextLine()を呼び出した場合、2冊目のタイトル入力が飛ばされます。その原因は、nextInt()が数値のみを読み取り、改行文字を読み残すことにあります。
1回目のループでnextInt()は数字だけを読み取り、Enterキー(改行)を残します。
・「java⏎」← nextLine()で[改行]をすべて取得し、改行を入力終了と判断する
・「1000⏎」← nextInt()で[1000]のみ取得し、[改行]が残る
2回目のループでnextLine()は残された”改行まで”を一つの文字列として読み取るため、何も入力していないのに処理が進んでしまいます。
・nextLine()が残った[改行] を取得し、空文字のまま数字入力に進む
一方 next() は、空白や改行を飛ばして次の文字を探すため、この問題が起きにくくなっています。