コンストラクタは、クラスの新しいインスタンスを作るメソッドで、メンバー変数の初期化などが必要なときに定義します。
引数の異なる複数のコンストラクタを定義することができ、それを活用すると便利なときがあります。
【 例 】 width(幅)と height(高さ)を属性に持つ四角形(Rect)クラス
Rectクラスのインスタンスを作る際、次のいずれかで初期値を指定したいものとします。
(1) 幅も高さも指定したい
(2) 幅は 10.0 固定で、高さだけ指定したい
class Rect { double width; //幅 double height; //高さ // (1) 幅も高さも引数で指定する Rect( double w, double h ) { width = w; height = h; } // (2) 高さだけを引数で指定し、幅は10.0固定とする Rect( double h ) { this( 10.0, h ); } // メンバーの値を返すメソッド double getWidth() { return width; } double getHeight() { return height; } } class UseRect { public static void main( String[] args ) { Rect r1 = new Rect( 8.0, 4.0 ); // コンストラクタ(1)で作成 System.out.println( "r1 幅:" + r1.getWidth() ); System.out.println( "r1 高:" + r1.getHeight() ); Rect r2 = new Rect( 15.0 ); // コンストラクタ(2)で作成 System.out.println( "r2 幅:" + r2.getWidth() ); System.out.println( "r2 高:" + r2.getHeight() ); } }
(2) のコンストラクタでは this( 10.0, h ) により、(1) のコンストラクタを呼び出しています。同じ機能をあちこちに書かず、このように this を使って該当する他のコンストラクタを呼び出して使います。
複数のコンストラクタを用意する機能は、コンストラクタのオーバーロード(多重定義)と呼ばれます。 上の例のように複数のメンバー変数があるとき、状況によって一部のメンバー変数だけデフォルト値を使用し、あとは指定するようなケースで便利です。 コンストラクタの名前は、すべてクラスと同じ名前にする決まりです。 どのコンストラクタが呼び出されるかは、渡す引数によって決まります。
(今回のクイズです)
上記のプログラムに、もうひとつ次のようなコンストラクタ(3) を追加定義してください。
(3) 幅も高さも 10.0 固定で、引数には何も指定しない
Rect r3 = new Rect(); // コンストラクタ(3)で作成
System.out.println( "r3 幅:" + r3.getWidth() );
System.out.println( "r3 高:" + r3.getHeight() );
(答えは、次回の Java の Tips で ・・・)
//メンバー変数としてfinalのCARRIAGEを定義します final static int CARRIAGE = 500; //totalPriceメソッドは次のように修正します int totalPrice() { return price * count + CARRIAGE; }