コンストラクター



 コンストラクター(構築子)とは何かと言うと、インスタンスを生成するときに、渡された引数に基づいてインスタンスの初期設定・初期動作を行うメソッドで、生成と同時に自動的に実行される。クラスファイルの実行で最初に呼び出されるクラス(ジェネラル)のmainメソッドと良く似た機能を持っている。
 似てはいるが、しかし、引数の数、種類に対応して別々のコンストラクターを設定しなければならない(オーバーロード)。ならないと言うよりは、あって便利な機能なのだが、そんなことよりも当初から激しく疑問なことがある。


 なぜ、コンストラクタークラス名と同じ名前のメソッドでないといけないのか?


 引数に合わせて4個も5個もコンストラクターがある場合クラス名を変える度に一々修正しなければならない。修正し忘れると、コンパイラーにコンストラクター無しと認識されるだろう。時間が経つとそれがコンストラクターメソッドだったのかすら思い出せない可能性がある。ミスの元である。(といっても、名前を付け替えるなんて機会はそうそう無いが・・・。)


 それはそれとして、メインメソッドがmainとなっているのだからコンストラクターconstructorと書くべきではないのか?これならクラス名を変えても全くコンストラクター変更の手間がないはずだ。いつも全くもって無駄な作業をさせられている感がある。

 もしかしたら「配列の宣言法の拡張だから。」なのかもしれない。
 例えばint型配列の宣言の場合は


int[] i = new int[5];
 であり、これに対し、クラス宣言は

classA a = new classA(int b,int c);
であり、両者とも、型のインスタンス(実例)の生成時に

型名 インスタンス名 = new 型名(型の設定に必要な引数)
の形式で宣言しているからだ。

そして、上記を踏まえると、
「その場合には、コンストラクターメソッドの呼び出しには以下のやり方
(constructor(int x, int y)ではなく
クラス名(int x, int y)とする )
の方が、いちいち「constructor」に変換しなくていいので処理上はちょっと楽」だから、クラス名でコンストラクターを呼び出しているのかもしれない。(あくまでもちょっと楽になるだけだと思うのだが・・・)



 さて、オマケであるが、コンストラクターでの妙なコンパイルエラーの一例を挙げよう。


初級編:このコンパイルエラーの原因は何か?


classA.java:34: super の呼び出しはコンストラクタの
先頭文でなければなりません。
super();
^
これのソースはこうである。

public classA extends class1{
【省略】
public void classA(int x, int y){
super();//←34行目
【省略】
}
}
 ここでsuper( )は、スーパークラス(ここではclass1)のコンストラクターを呼び出す(流用する)命令である。
 明らかに先頭文で使っているにもかかわらず、この仕打ち。姑の嫁イビリかよぉ。