8.インスタンスの生成
2007.04.13 株式会社四次元データ 西谷太郎
- 8.1. コンストラクタ
- 8.2. Humanクラスに実体を持たせる
8.1. コンストラクタ
コンストラクタとは全てのクラスが持っています。コンストラクタが働くのは主にインスタンスを生成するときです。主なものとしては以下の点が挙げられます。
- メソッドの一種である。
- コンストラクタの名前はクラス名と同一でなければならず、返り値も指定しない(voidも書かない)。
- メンバではない。
→したがって継承されず、オーバーライドもできない。 - クラス内で宣言されなくても、コンパイラから暗黙的に提供される。
- インスタンスを生成するときや、他のコンストラクタからの呼び出し、+演算子による文字列変換でのみ呼び出され、メソッド呼び出し式で直接呼び出すことは出来ない。
上から順番に解説していきましょう。
コンストラクタの宣言は以下のような形で行います。
アクセス修飾子 コンストラクタ名(引数の型1 引数名1, 引数の型2 引数名2, ...) { コンストラクタ内の処理 }
まず、コンストラクタはかなり特殊な存在ではありますが、メソッドでもあります。ですから、メソッドを扱うときと重複する部分もいくらか存在します。
上で、メソッドとの類似についてすこし触れましたが、返り値の指定が無いことと、コンストラクタ名がクラス名と同じでなければならないことを除けば、型はメソッドと同じです。
コンストラクタは、そもそも値を返さないメソッドです。はじめから値を返さないことが決まっているので、返り値の指定はvoidも含めて行いません。
また、メソッドでありながらメンバではないため継承されず、従ってオーバーライドされることもありません。ちなみにオーバーロードはできます。
クラスの作成のときにコンストラクタを宣言しなかった場合、コンパイル時にコンパイラから暗黙的にコンストラクタが提供されます。つまり、コンストラクタの無いクラスは無いわけです。
このコンストラクタは、デフォルトコンストラクタと呼ばれる引数を取らないコンストラクタで、アクセス修飾子はクラスがpublicならpublic、それ以外ならデフォルトアクセスになり、メソッド内の処理はスーパークラスのデフォルトコンストラクタを呼び出します。
但し、スーパークラスを持たないObjectクラスの場合は空の本体を持ちます。
スーパークラスにデフォルトコンストラクタが無い場合は暗黙的に提供されるコンストラクタは使えません。
コンストラクタを呼び出すのは、インスタンスの生成時か、コンストラクタ内から他のコンストラクタを利用する時のみです。+演算子による文字列変換の際にも呼び出されますが、実装の際にこれを意識することはほとんどありません。
8.2. Humanクラスに実体を持たせる
さて、ここまでHumanクラス、Studentクラスを作ってきました。ここまではまだ漠然と人間という実体のない「概念」を相手にしているだけでしたが、ここからは一人一人識別できる実際の人間(つまりインスタンス)を扱っていきましょう。
ではこのファイルを読み取って、インスタンスを生成するクラスを作っていきましょう。始めに覚えることはインスタンスの生成の仕方。newという演算子を利用します。
new クラス名(引数, 引数, ...);
これで、指定したクラスの新しいインスタンスが作成され、指定した引数の数および型に応じてこのクラスのコンストラクタが呼び出されます。また、new演算子は作成されたインスタンスへの参照を返します。通常はその参照を同じクラス型の変数に代入し、その変数を通してインスタンスにアクセスします。
では、早速Humanクラスのインスタンスを作ってみましょう。新たにCSVReaderというクラスを作成して、その中でHumanインスタンスのtaroを生成します。
public class CSVReader { public static void main(String[] args) { Human taro = new Human(); } }
これで、Humanクラスのインスタンスが一つ作成され、Human型の変数humanにそのインスタンスの参照が代入されました。
ところで、ここに登場しているpublic static void main(String[] args) { ... } というクラスメソッド(static修飾子がついていますね)は、アプリケーションの最初に呼び出される特殊なメソッドです。これはそのまま記述してください。
すると、このCSVReaderを実行したときにこのmain()メソッドの中の部分が実行されます。
最終的には、何かの外部に操作のしやすいファイルを作ってそこから読み込む形にしたい。ということで、次章は外部のファイルを読み込む方法について解説します。その場合でも、結局は今やったようにメソッドを利用して値を与えるというやり方をとります。