Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのデフォルトコンストラクタと引数付きコンストラクタの違いとは?わかりやすく解説

Javaにおけるコンストラクタは、オブジェクト生成時に自動的に呼び出される特殊なメソッドで、インスタンス変数の初期化を担います。コンストラクタは大きく分けて「デフォルトコンストラクタ」と「引数付きコンストラクタ(パラメータ化コンストラクタ)」の2種類があります。本記事では、それぞれの特徴と違いを具体例とともに解説します。

デフォルトコンストラクタとは

  • デフォルトコンストラクタは、引数を一切取らないコンストラクタであり、内部ではスーパークラスのコンストラクタを引数なしで呼び出します。
  • 主な役割は、新しく生成されたオブジェクトにデフォルト値を割り当てることです。
  • コンパイラがデフォルトコンストラクタをコードに書き込むのは、プログラマがクラス内に一つもコンストラクタを定義していない場合のみです。
  • デフォルトコンストラクタのアクセス修飾子は基本的にクラスの修飾子と同じになります。ただしこのルールが適用されるのは、「public」および「default(パッケージプライベート)」の場合に限られます。

コンパイラがデフォルトコンストラクタを追加する条件

  • コンパイラがデフォルトコンストラクタを追加するのは、プログラマがコード内に一切コンストラクタを書いていない場合だけです。
  • 逆に、プログラマが一つでもコンストラクタを定義していれば、コンパイラは何も追加しません。
  • すべてのデフォルトコンストラクタは0引数コンストラクタですが、すべての0引数コンストラクタがデフォルトコンストラクタであるとは限りません。プログラマが明示的に記述した0引数コンストラクタは「引数なしコンストラクタ(no-arg constructor)」として区別されます。

引数付きコンストラクタ(パラメータ化コンストラクタ)とは

  • 引数付きコンストラクタは、呼び出し時に特定の数の引数を渡す必要があるコンストラクタです。
  • その目的は、異なるオブジェクトごとのインスタンス変数に、ユーザーが指定した具体的な値を代入することです。
  • 必ずプログラマが明示的に記述します。コンパイラが自動生成することはありません。
  • アクセス修飾子に関するルールはデフォルトコンストラクタと同様に、「public」および「default」修飾子の場合にクラスの修飾子と一致します。

サンプルコード

public class Student {
   int roll_no;
   String stu_name;
   Student(int i, String n) { // 引数付きコンストラクタ
      roll_no = i;
      stu_name = n;
   }
   void display() {
      System.out.println(roll_no+" "+stu_name);
   }
   public static void main(String args[]) {
      Student s1 = new Student(1,"Adithya");
      Student s2 = new Student(2,"Jai");
      s1.display();
      s2.display();
   }
}

上記のプログラムでは、プログラマが2つの引数を受け取る引数付きコンストラクタを1つ定義しています。この場合、コンパイラはデフォルトコンストラクタを追加せず、プログラマ自身も0引数コンストラクタを書いていないため、new Student() のように引数なしでインスタンス化しようとするとコンパイルエラーになる点に注意してください。

実行結果

1 Adithya
2 Jai

両者の違いまとめ

項目デフォルトコンストラクタ引数付きコンストラクタ
引数の数0個1個以上
定義者コンパイラが自動生成プログラマが明示的に記述
主な役割デフォルト値の割り当て任意の初期値の設定
生成条件コンストラクタ未定義時のみ必要に応じて自由に定義可能

このように、デフォルトコンストラクタはコンパイラによる自動生成に依存するのに対し、引数付きコンストラクタは開発者が意図した値でオブジェクトを初期化できる点が最大の違いです。実務では、オブジェクトの状態を明確かつ安全に管理したい場面で引数付きコンストラクタが広く活用されています。

  1. JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説

    JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ

  2. JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント

    JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ