Developer

【はじめてのJava】コンストラクタ ~復習問題~
2022.10.31
Lv1

【はじめてのJava】コンストラクタ ~復習問題~

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


コンストラクタ ~復習問題~

今回はコンストラクタの内容を復習し、JavaSilverにおいてよく狙われるポイントを確認していきます。

目次


コンストラクタのおさらい

コンストラクタとは、メソッドの一種です。クラスのインスタンス化時には、オブジェクトの初期化を行います。
コンストラクタは、(1)コンストラクタ名は必ずクラス名と同じ名前となり、(2)戻り値の指定ができないメソッドです。
コンストラクタに関する各記事は、下記を参照してください。

[1]コンストラクタ                                  記事はこちら
[2]引数付きのコンストラクタ            記事はこちら
[3]コンストラクタのオーバーロード      記事はこちら
[4]コンストラクタの注意点                        記事はこちら


問題

それでは、さっそく問題を解いてみましょう!

public class Book {
	String name;
	int page;

	Book() {
		name = "無題";
	}

	void Book(String name, int page) {
		System.out.println("タイトルは" + name + ",ページ数は" + page + "です。");
	}
}

このプログラムを利用した以下のクラスを、コンパイル・実行したときの結果として、正しいものを選びなさい。

public class Main{
	public static void main(String[] args) {

		Book a = new Book();
		a.Book("吾輩は猫である", a.page);
	}
}

A. 「タイトルは吾輩は猫である,ページ数は0です。」と表示される。
B.     「タイトルは無題,ページ数は0です。」と表示される。
C   「タイトルは吾輩は猫である,ページ数はnullです。」と表示される。
D.       何も表示されない。
E.        実行時に例外がスローされる。
F.        コンパイルエラーが発生する。


解答

解答 A

Mainの結果

>javac Main.java
>java Main
タイトルは吾輩は猫である,ページ数は0です。

解説

今回の問題を解く上で注意すべきポイントは、2点です!

[1]メソッドとコンストラクタの違いの理解
[2]変数の初期値の理解

これら2点に注目し、設問を見ていきましょう!

今回の問題は、Bookクラスを作成し、それを基にしてMainクラスでインスタンス化をしています。

Bookクラスに注目すると、まず2行目・3行目でString型の変数name、Int型変数のpageがインスタンス変数として宣言されています。値が代入されていないため、この時、変数の初期値はnameはnull、pageは0です。
次に5-7行目で引数がなしでインスタンス化された時の初期値となるコンストラクタが記述されています。(戻り値の指定がなく、名前Bookがクラス名と同じことからコンストラクタだと分かります。)name = “無題”と記述されていることから、引数なしでインスタンス化されたときの初期値は、nameは無題、pageは0です。
最後に9-11行目ですが、こちらも一見すると名前がBookであることから、引数2つの際のコンストラクタに見えます。
しかし、戻り値としてvoidが指定されてしまっています!よって、これはコンストラクタでなく、通常のメソッドと見なされます。

public class Book {
	String name;// 変数定義・name初期値「null」
	int page;// 変数定義・page初期値「0」

	Book() {// 引数なしの時のコンストラクタ
		name = "無題";// 変数代入・name初期値「無題」
	}

	void Book(String name, int page) {// 引数2つのメソッド
		System.out.println("タイトルは" + name + ",ページ数は" + page + "です。");
	}
}

次は、Bookクラスの内容を踏まえたうえでMainクラスを確認します。

すると、まず4行目で引数なしでインスタンス化を行っています。この時、Bookクラス5-7行目のコンストラクタによって初期化されるので、変数の値はnameは無題、pageは0です。
次に、5行目を確認すると4行目で作成したインスタンス「a」を基に、Bookクラス9-11行目で記述されたメソッドを使用しています。引数に着目すると、nameは吾輩は猫である、pageはオブジェクトaの値0を渡し、実行しています。
よってメソッドの実行結果は「タイトルは吾輩は猫である,ページ数は0です。」となります。

public class Main1 {
	public static void main(String[] args) {

		Book a = new Book();// 引数を与えずインスタンス化
		a.Book("吾輩は猫である", a.page);// 変数代入し、メソッド実行
	}
}

Mainの結果

>javac Main.java
>java Main
タイトルは吾輩は猫である,ページ数は0です。

したがって、解答は、A. 「タイトルは吾輩は猫である,ページ数は0です。」と表示される。になります!

次回の内容

今回はコンストラクタの復習問題を扱いました。
インスタンス化の際は、コンストラクタの状態を理解することも重要ですので、よく覚えておいてください。

次回は、「初期化処理のまとめ方」について扱います。

次回記事はこちら


はじめてのJavaシリーズの記事一覧はこちら
シリーズ全記事一覧
環境構築編
プログラムの作り方編
データ型と変数編
演算子編


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら