検索

キーワード


【Java】 コンストラクタの役割から書き方、継承方法までの基礎

  • 公開日:2020-08-25 15:50:21
  • 最終更新日:2021-01-25 19:05:28
【Java】 コンストラクタの役割から書き方、継承方法までの基礎

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてコンストラクタについて紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:インスタンスとは? / クラスの宣言方法 / メソッドの役割・書き方 / アクセス修飾子の使い分け方 / 引数とは? / 継承とは? / thisとsuperの使い方

コンストラクタの役割と使い方

クラスは new演算子を使ってインスタンス生成をして利用します。

インスタンス生成の段階でインスタンスは引数なしも含み必ずコンストラクタが呼ばれます。

ここではクラスとセットで存在するコンストラクタについて紹介させていただきます。


コンストラクタの役割と書き方

コンストラクタはクラスのインスタンス生成時に呼び出され、

インスタンスの初期値を設定することができます。

・コンストラクタの基本構文: アクセス修飾子 コンストラクタ名( 引数の型 引数名 ) { 処理内容 }

コンストラクタ名は必ずクラス名と同じ名前となります。

コンストラクタの基本構文を使ったサンプルコードを見てみましょう。


◆コンストラクタの例(引数なし)

public class ConstractorTest {

	// ↑クラス名と、↓コンストラクタ名は同名にする
	public ConstractorTest() {
		
	}
}

 ※下記のように戻り値の型を書くとメソッドとして判断されるため注意しましょう。

  コンストラクタ名が付いたメソッド ➡「public void ConstractorTest(){ }」


またコンストラクタは必ずクラスが持つものなので、

コンストラクタを書かなかった場合でも自動生成されるようになっています。

自動生成されるコンストラクタは引数なしのコンストラクタです。

// 暗黙的に「public ConstractorTest(){ }」が自動生成されている
public class ConstractorTest {
 
	// コンストラクタを一つも書いていない

}


引数ありのコンストラクタの書き方も合わせて確認しておきましょう。

◆コンストラクタの例(引数あり)

public class ConstractorTest {

	// String 型の引数 str を持ったコンストラクタ
	public ConstractorTest(String str) {
		
	}
}

◆コンストラクタの例(複数の引数あり)

public class ConstractorTest {

	// String と int 型の引数を持ったコンストラクタ
	public ConstractorTest(String str, int num) {
		
	}
}


基本的なコンストラクタの作成方法がわかりましたので、次にコンストラクタの利用例を見ましょう。

あえてコンストラクタを書かず自動生成されることも同時に確認してみたいと思います。

◆インスタンス生成するためのクラス

// 暗黙的にコンストラクタ生成
public class ConstractorTest {

}

◆インスタンス生成するクラス

public class ConstractorTest2 {

	ConstractorTest test = new ConstractorTest();
}

インスタンス生成の後方がコンストラクタです ➡ クラス名 変数名 = new クラスのコンストラクタ名( );

ConstractorTestクラスで暗黙的に自動生成されたコンストラクタを使うことができました。


自動生成されるコンストラクタの注意点

クラス内にコンストラクタを書かなかった場合、引数なしのコンストラクタが自動生成されますが、

クラス内に1つでもコンストラクタを書くと、

引数あり・なしに関わらずコンストラクタの自動生成は行われませんので注意しましょう。



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

メソッド同様にコンストラクタにもオーバーロードの機能があります。

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

同じクラス内で同じコンストラクタ名から引数の異なるコンストラクタを生成することです。

異なる引数の判断は、引数の数引数の型引数の順番の違いで行われます。


コンストラクタをオーバーロードすることで、

1つのクラスから初期値の異なるインスタンスを複数生成することができるようになります。

以下サンプルコードのコンストラクタは全て同じクラス内に存在しますが、

全て異なるコンストラクタとして判断されます。


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

public class ConstractorTest {

	// 引数なしのコンストラクタ
	public ConstractorTest() {
		
	}

	// 引数が1つのコンストラクタ
	public ConstractorTest(String str) {
		
	}

	// 上記と型違いの引数1つのコンストラクタ
	public ConstractorTest(int number) {
		
	}

	// 引数が2つのコンストラクタ
	public ConstractorTest(String str, int number) {
		
	}

	// 上記と引数の順番が違うコンストラクタ
	public ConstractorTest(int number, String str) {
		
	}
}


コンストラクタのthis

thisを使うことでコンストラクタから、オーバーロードした別コンストラクタへアクセスすることができます。

コンストラクタで this を使うには this( 引数 ); と書き、

引数の型の種類や数、順番でどのコンストラクタへアクセスするか判断されます。

this はコンストラクタの始めに書かなくてはならず、

フィールドへの代入などを this よりも先に書くことができないため注意が必要です。

 ※ this の詳しい紹介は別記事でさせていただきます。

public class ConstractorTest {

	public String word;
	public int number;

	public ConstractorTest() {
		this("a"); // 引数が String 型のコンストラクタへアクセス
		number = 1; // this の後であればフィールドへの代入が可能
	}

	public ConstractorTest(String str) {
		this.word = str;
	}
}


this は各コンストラクタで1つずつ使うことができます。

このように this を使うことで、より複雑な処理が可能となります。



継承クラスと親コンストラクタ

Java ではオブジェクト指向の考え方のひとつに「継承」があります。

詳しくは別記事にて紹介しますが、簡単に紹介するとクラスまたはインターフェースの機能を受け継いで、

新たにクラスまたはインターフェースを作成することを継承と呼びます。

 例 ) クラス①(親クラス) ➡継承➡ クラス②(子クラス)

継承元を「親クラス」と呼び、継承したクラスを「子クラス」と呼びます。

また「親クラス」はスーパークラスとも呼ばれます。


コンストラクタの役割は先述した通り、クラスの初期化を行うことができます。

しかしコンストラクタは、基本的にそのコンストラクタが書かれたクラスの初期化しか行いません。

つまり継承した子クラスでは、親クラスのコンストラクタは継承していません。

そのため、継承で子クラスを作成した際は子クラス独自のコンストラクタを作成することになります。

また子クラスのコンストラクタ内で「super」を宣言して親クラスのコンストラクタを呼びだすこともできます。


親クラスのコンストラクタ

継承した子クラスのコンストラクタ内で super を宣言することで、

親クラスのコンストラクタを呼ぶことができます。

super は「スーパークラス」の「スーパー」です。


◆親クラスのコンストラクタ呼び出し例

 【親クラス】

public class ConstractorTest {

	public ConstractorTest() {
	}

	public ConstractorTest(String str) {
	}

	public ConstractorTest(int number) {
	}

	public ConstractorTest(String str, int number) {
	}

	public ConstractorTest(int number, String str) {
	}
}

先ほどオーバーロードの例で出したクラスを使ってみます。


 【子クラス】

// ConstractorTest クラスを継承した ConstractorTest2
public class ConstractorTest2 extends ConstractorTest{

	public ConstractorTest2() {
		super("親コンストラクタ"); // 引数に String型を持つ親コンストラクタの呼び出し
	}
}

ここでの「super("親コンストラクタ");」は親クラスの「public ConstractorTest(String str);」を使いました。

super = ConstractorTest

”親コンストラクタ” = String str ➡ 引数の型が「String 型1つ」のコンストラクタが選ばれる



フィールドの初期化( this )

インスタンスの初期化は、コンストラクタによって行われます。

引数なしのコンストラクタの場合、引数が渡されなかった際の初期値を書くことができます。

引数ありのコンストラクタの場合は、

引数が受け取った値をフィールドへ代入してあげることでインスタンスが初期化されます。


引数ありのコンストラクタが同クラス内のフィールド変数へ代入を行う際は、よく「 this 」が使われます。

英語の this とは概念が若干異なるため混乱しやすいですが、Java での this は自分自身を表します。

 ※ this の詳しい考え方や使い方は別記事で紹介します。


サンプルコードを見てみましょう。

ここでは「this」を「このクラス自身」の意味で使います。

public class ConstractorTest {

	// String 型の変数名 str のフィールド
	public String str;

	// 引数なしのコンストラクタ
	public ConstractorTest() {
		str = "引数なし";
	}

	// 文字列を引数に受け取って上記フィールドへ代入するコンストラクタ
	public ConstractorTest(String str) {
		this.str = str;
	}
}

【引数なし】

フィールドの変数 str に「引数なし」を代入しています。

【引数あり】

コンストラクタの「this.str = str」右側の「str」がコンストラクタの変数 str です。

コンストラクタの「this.str = str」左側の「this.str」がフィールドの変数 str です。


ここまで書いてクラスのインスタンス生成時に初期化を行えるようになりました。

上記クラスを使ってインスタンスを生成してみましょう。


◆初期化で文字列を持ったインスタンスの生成

public class ConstractorTest2 {

	public static void main(String[] arg) {

		// 引数なしのコンストラクタ
		ConstractorTest test = new ConstractorTest();
		System.out.println(test.str);	// 結果:「引数なし」と表示

		// 引数ありのコンストラクタ
		ConstractorTest test2 = new ConstractorTest("引数あり");
		System.out.println(test2.str);	// 結果:「引数あり」と表示
	}
}


引数ありと引数なしで、フィールドを初期化したインスタンスの生成ができました。


まとめ

インスタンス生成時にコンストラクタを使うため、クラスは必ずコンストラクタを持ちます。

コンストラクタが引数を持つ場合はフィールドへコンストラクタの引数の値を代入することで、

フィールドの初期化を行えます。

コンストラクタはもちろんのこと、フィールドやメソッドも含んでクラスの基本的な仕組みとなります。


関連記事リンク

インスタンスとは? / クラスの宣言方法 / メソッドの役割・書き方 / アクセス修飾子の使い分け方 / 引数とは? / 継承とは? / thisとsuperの使い方


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様