【Java】コンストラクタについて

コンストラクタとは

前回はインスタンスを作成し、フィールドを読み書きする方法と、メソッドを呼び出す方法を解説しました。
ところで、毎回、長方形の大きさを設定するときnew演算子インスタンスを作成した後、setSizeで別途呼び出す必要がありました。インスタンス化すると同時に長方形の大きさが設定できた方が楽ですよね。
Javaでは、初期化を行うためのコンストラクタという仕組みがあります。インスタンス化すると同時に、インスタンスを初期化することができます。

コンストラクタを宣言する

コンストラクタの宣言は、メソッドの宣言と似ています。メソッドと違う点は以下の2点です。

  1. コンストラクタには戻り値の型がない
  2. コンストラクタの名前はクラス名と同じ

それでは実際に長方形の大きさを定義するコンストラクタを宣言してみます。

public class Rectangle{
    public Rectangle(int w,int h){
      this.width = w;  //this.でインスタンスのフィールドを指します。
      this.height = h; //Rectangle(int w,int h)の引数をフィールドに代入します。
  }
}

デフォルトコンストラク

幅も高さも指定しないでRectangleのインスタンスをつくる場合があります。そういった場合、初期設定があったほうがよい場合があります。引数を指定しないときのインスタンスの初期化を記述するのがデフォルトコンストラクタです。初期設定を(0,0)とした場合を記述してみます。

public class Rectangle{
    public Rectangle(){
      this(0,0); //this()はコンストラクタRectangle()を指します。
                       //引数でフィールドの値を指定します。
  }
}

コンストラクタを呼び出す

幅と高さを指定したコンストラクタを呼び出すには、次のようにします。
インスタンスの引数()に長方形の大きさを代入します。

Rectangle r2 = new Rectangle(20,2);

デフォルトコンストラクターで初期設定を定義したので、インスタンスの引数( )を空にした状態で宣言することもできます。

Rectangle r2 = new Rectangle( );

追記:this、super

スーパークラスは「スーパークラスとサブクラス」で詳しく解説します。

this が「自分の」インスタンスを指すのに対して、
super は、「スーパークラスの」インスタンスを指します。

this() は「自分の」インスタンスのコンストラクタ、
super() は「スーパークラスの」インスタンスのコンストラクタ呼び出しを表します。

完成

//長方形を定義するクラス
class Rectangle{
		
		//フィールドの宣言
		//長方形の幅と高さを定義
		private int width;
		private int height;
		
		//デフォルトコンストラクタ
		public Rectangle(){
			this(0,0);
		}
		
		//コンストラクタ
		public Rectangle(int w,int h){
			this.width = w;
			this.height = h;
		}
		
		//メソッドの宣言
		/*
		//デフォルトコンストラクタで長方形の大きさは定義したのでコメントアウトします
		
		//1:大きさを定義するメソッド
		public void setSize(int w,int h){
		width = w;
		height = h;
		
		
		以下のように記述することができます。
		thisはインスタンス自身を表すものです。
		メソッドの宣言のなかでは、フィールドやメソッドの前にインスタンスを指定する必要はありません。
		コンパイラによって自動的にthisが補完されるからです。
		
		//this.width = w;
		//this.height = h;
		}
		*/
		
		//2:面積を求めるメソッド
		public int getArea(){
			return width * height;
		}
	
	
	//メインメソッド
	public static void main(String[] args) {

		//インスタンス:フィールドへのアクセス&メソッドの呼び出し
		//new演算子で作成したインスタンスを、Rectangle型として宣言した変数rに代入
		Rectangle r = new Rectangle();
		
		//メソッドの呼び出し(デフォルトコンストラクターで定義した長方形値を表示)
		System.out.println("幅は、" + r.width);
		System.out.println("高さは、" + r.height);
		System.out.println("面積は、" + r.getArea());
		
		System.out.println("-------------");
		
		//新しいインスタンスr2(引数で定義した長方形の値を表示)
		Rectangle r2 = new Rectangle(20,2);
		
		//メソッドの呼び出し
		System.out.println("幅は、" + r2.width);
		System.out.println("高さは、" + r2.height);
		System.out.println("面積は、" + r2.getArea());
		
	}

}