手を動かして学ぶ Java入門 (クラス・コンストラクタ)
環境構築不要! ブラウザから直接コードを実行できます。
本記事では、Java のクラス・コンストラクタについて学びます。
10分くらいで、さくっと終わる記事をめざしています。
シリーズ一覧
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
続きは近日公開予定!
はじめに
この記事は paiza.IO の「Online Java compiler」を利用しています。
2024/12/17 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)
実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。
詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。
メソッドのおさらい
以前の記事 では、クラスのメソッドについて学びました。
メソッドとは、プログラムの実際の処理をまとめたものです。
足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。
例えば、次の Human クラスには say という名前のメソッドがあります。
public class Human {
public void say() {
System.out.println("こんにちは!");
}
}
Human human = new Human();
human.say();
このプログラムを実行すると、画面には次のように表示されます。
こんにちは!
また、メソッドには パラメータ(引数) を指定することもできます。
public class Human {
public void say(String yourName) {
System.out.println("こんにちは、" + yourName + "さん!");
}
}
Human human = new Human();
human.say("アリス");
このプログラムを実行すると、画面には次のように表示されます。
こんにちは、アリスさん!
コンストラクタ
コンストラクタは、new 演算子でクラスのインスタンスを生成するときに呼び出される メソッド です。
メソッドと同じようにパラメータを指定することもできます。
コンストラクタの主な役割は フィールドの初期化 です。
Human クラスを例に見てみましょう。
public class Human {
private String name;
// コンストラクタ!
public Human(String n) {
name = n;
}
public void say() {
System.out.println("私の名前は " + name + " です!");
}
}
コンストラクタは次の部分です。
public Human(String n) {
name = n;
}
Human クラスのフィールド(name) に対して、コンストラクタのパラメータ(n) で初期化(代入) していますね。
コンストラクタのパラメータは、new 演算子によるインスタンス生成時に指定します。
次の例では、パラメータ n に文字列の "アリス" を指定しています。
Human human = new Human("アリス");
human.say();
それでは実際にコードを動かしてみましょう。
結果がどうなるか予想してから「実行(Ctrl-Enter)」ボタンを押してください。
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか? 「出力」のところに
私の名前は アリス です!
と表示されたら成功です。
宣言
コンストラクタの宣言は、メソッドとほぼ同じです。
public class Human {
// コンストラクタ!
public Human(String n) {
...
}
...
}
宣言の基本は
- アクセス修飾子 + クラス名 + ( パラメータ ) + { ... }
となります。
public Human(String n) {
^^^^^^ <--- アクセス修飾子
...
}
アクセス修飾子については 後述 します。
public Human(String n) {
^^^^^ <--- コンストラクタ名 (クラス名と同じにする)
...
}
コンストラクタの名前はクラス名と同じにします。
この例の場合は Human です。
public Human(String n) {
^^^^^^^^ <--- パラメータ
...
}
パラメータはメソッドと同じです。
もちろん複数のパラメータも指定できますし、パラメータなしにもできます。
public Human(String n) {
^ <--- コンストラクタの開始
...
}
^ <--- コンストラクタの終了
最後に { ... } で囲います。
このカッコで囲まれた範囲がコンストラクタの中身になります。
メソッドと違い 戻り値の型 は必要ありません。
(void の指定も必要ありません)
public void Human(String n) {
^^^^ <--- ★これは間違い!
...
}
アクセス修飾子
コンストラクタのアクセス修飾子を使うと、
- 公開 : クラスの外から new 演算子でインスタンスを生成できる
- 非公開 : クラスの外から new 演算子でインスタンスを生成できない
という制御ができます。
とはいえ、コンストラクタは public (公開) にするのが一般的です。
(private (非公開) にすることもありますが、あまり多くはありません)
private (非公開) のコンストラクタの挙動がイメージしづらいかもしれないので、例で見てみましょう。
次の例では、Human クラスのコンストラクタを private にしています。
public class Human {
private Human() {
}
public void say() {
System.out.println("こんにちは!");
}
}
コンストラクタは private (非公開) です。
よって、Human クラスの外 (この場合は Mainクラス) で new 演算子を使うとコンパイルエラーになります。
public class Main {
public static void main(String[] args) {
Human human = new Human(); // コンパイルエラー
human.say();
}
}
実際にコンパイルエラーになることを確認してみましょう。
コードは変更せずに、そのまま「実行(Ctrl-Enter)」ボタンを押してください。
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか?
Main.java:4: error: Human() has private access in Human
Human human = new Human();
^
1 error
とコンパイルエラーになれば成功です。
"error: Human() has private access in Human" とは、意訳すると
- コンストラクタの Human() は private です。(よって外からはアクセスできません)
という感じです。
アクセス修飾子を public (公開) にすると、Human クラスの外で new 演算子が使えるようになります。
public class Human {
public Human() {
}
public void say() {
System.out.println("こんにちは!");
}
}
Human human = new Human(); // コンパイルOK
先ほどのコードを書き換えて、実際にコンパイルOKになることを確認してみましょう。
Human クラスの
public class Human {
private Human() {
}
...
}
これを…
public class Human {
public Human() {
}
...
}
に書き換えてから「実行(Ctrl-Enter)」ボタンを押してください。
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか? 「出力」のところに
こんにちは!
と表示されたら成功です。
デフォルトコンストラクタ
さて、過去の記事も含めて、今までコンストラクタを宣言していないクラスはいくつもありました。
コンストラクタがないのに、なぜ new 演算子が使えていたのでしょうか?
その答えは デフォルトコンストラクタ にあります。
クラスにコンストラクタが1つもなければ、Java は 暗黙的に デフォルトコンストラクタを作ります。
例えば、
public class Sample {
}
このようなクラスがあった場合は、
public class Sample {
public Sample() {
}
}
と宣言したのと同じ意味になります。
デフォルトコンストラクタは
- パラメータなし
- 中身も空 (なにも処理しない)
として作られます。
よって、コンストラクタのないクラスでも、
Sample sample = new Sample();
このように、new 演算子でクラスのインスタンスが生成できていたわけですね。
補足
- 厳密には、デフォルトコンストラクタの中身は空ではなく、super() を呼び出しています。
ただ、そのあたりの話はまだ難しいと思うので、この記事では割愛します。
応用問題
【問題】
まずは、下記のプログラムをそのまま「実行(Ctrl-Enter)」してみましょう。
結果はコンパイルエラーになったはずです。
Human クラスは、4か所 ### となっています。
public class Human {
private String name;
private int age;
public Human(###, ###) {
###
###
}
...
}
ここを正しいコードに書き換えて、プログラムを実行すると
私の名前は ボブ です。
年齢は 20 歳です。
と「出力」に表示するようにしてください。
それでは、Human クラスの4か所の ### を書き換えて「実行(Ctrl-Enter)」してみましょう。
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
無事に、
私の名前は ボブ です。
年齢は 20 歳です。
と出力されましたでしょうか?
もし解けなかった場合は、下記の回答例をご参照ください。
回答例
【コード】
public class Human {
private String name;
private int age;
public Human(String n, int a) {
name = n;
age = a;
}
public void say() {
System.out.println("私の名前は " + name + " です。");
System.out.println("年齢は " + age + " 歳です。");
}
}
【出力】
私の名前は ボブ です。
年齢は 20 歳です。
まとめ
コンストラクタは、クラスのインスタンスを生成するときに呼び出される メソッド です。
クラスの初期化処理にとても便利なので、有効に活用したいですね。
次回は「手を動かして学ぶ Java入門 (文字列クラス)」になります。
関連記事
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)