Javaオブジェクト指向プログラミング(5) - コンストラクタ

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年8月20日日曜日

Javaオブジェクト指向プログラミング(5) - コンストラクタ


前回までのインスタンス化のやり方だと、インスタンス化(new)して、そのインスタンスが持っているフィールドに後から値を代入しています。それはインスタンス化された直後のフィールドはまだ何もデータを持っていないからです。

このような状態だとある不都合が生じる場合があります。例えば前回の侍クラスがゲームのキャラクターだったとしてインスタンス化をしたら、インスタンス直後はHPがないので、死んでいます。その後そのキャラクターを担当した開発者がhpフィールドに値をしっかり設定すれば良いのですが、人間なので忘れてしまうかもしれません。

このような不都合に対応するためにJavaではインスタンス直後に実行される処理を書くことができます。それがコンストラクタ(constructor)と呼ばれるメソッドです。

上記の6行目から8行目がコンストラクタです。このSamuraiクラスをインスタンス化してHPフィールドを表示してみましょう。300が表示されるはずです。下記が上記の侍クラスを呼び出すプログラム例です。

300は表示されましたでしょうか?コンストラクタを定義するかどうかは開発者次第ですが、定義されていたら、そのクラス(この場合は侍クラス)を使う側は呼び出したりすることはありません。あくまでインスタンス化されたときに自動で処理されるメソッドです。

コンストラクタを定義する

コンストラクタを定義
すると上記で書きましたが、そもそもどうやったらコンストラクタになるかを説明します。Javaでは以下の条件を全て満たすとコンストラクタとみなされます。

#1, メソッド名がクラス名が完全に同じ(SamuraiクラスであればSamuraiコンストラクタ)
#2, メソッドの戻り値がない

コンストラクタに引数を渡す



コンストラクタに引数を渡してフィールドなどに設定する値を動的にすることができます。上記のようにコンストラクタに引数を定義すると呼び側(mainクラス)でインスタンス化した時に、引数が求められます(ないとエラーになります)。

コンストラクタのオーバーロード

上記で引数がないとエラーになりますと書きましたが、実はエラーを回避する方法があります。それはコンストラクタのオーバーロードです。オーバーロードによりコンストラクタを複数定義できます。どのコンストラクタが呼び出されるかは引数の数や引数の型・順序などで決まります。複数のコンストラクタがあっても1つしか動作しないので覚えておきましょう。

コンストラクタがないクラスもコンストラクタが自動で追加される

実はどのJavaのクラスも、インスタンス時に必ずコンストラクタを実行しなければなりません。つまり、本来であればどのクラスも1つはコンストラクタが定義されていないといけません。しかしJavaの暗黙ルール的なものがあって、コンストラクタを開発者が定義しなくてもプログラムが動くようになっています。そのルールは以下の通り。

1つもコンストラクタがクラスに定義されていない場合、デフォルトコンストラクタがコンパイル時に自動的に追加される。デフォルトコンストラクタとは引数がなく、処理の内容が何もないコンストラクタです。

上記のプログラム例で引数付きにコンストラクタを定義した時に、呼び出し側(mainクラス)で引数を削除するとエラーが起きるのは、引数付きのコンストラクタを定義したため暗黙ルールから外れたからです。

複数コンストラクタがあるときに別のコンストラクタを呼び出す

コンストラクタを複数定義してみると、よくほぼ同じ定義だと思うことや「他のコンストラクタが使えたらな」と思うことがあります。その場合あるコンストラクタから他のコンストラクタを呼び出すことが可能です。下記はそのサンプルプログラムです。


mainクラスからは引数なしでインスタンス化していますので、コンストラクタは引数なしの方が動作します。そのコンストラクタで「this("武蔵");」としている部分がもう一つのコンストラクタを呼び出している部分です。結果引数付きのコンストラクタが呼ばれ、表示は300と武蔵が表示されるはずです。このようにあるコンストラクタから別のコンストラクタを呼び出すことができます。因みにこの「this」と「this.nameなどのthis」は別物です。前者は同一クラスの別のコンストラクタを呼び出すもの、後者は自分のインスタンスを表すものです。

◯「Javaオブジェクト指向プログラミング」シリーズの記事一覧はこちら



最近の投稿