HOWTO · Java

Java の抽象クラス コンストラクター

このチュートリアルでは、Java で抽象クラス コンストラクターを作成する方法を示します。

このページの内容

コンストラクターは、その名前で呼び出されるオブジェクトを初期化するために使用され、コンストラクターの名前はクラスの名前と同じです。

抽象クラスはabstractキーワードで宣言され、抽象クラスにもコンストラクターがあり、抽象クラスでコンストラクターを定義しない場合、JVMはデフォルトのコンストラクターを提供します。

このチュートリアルでは、Java の抽象クラスでコンストラクターを作成する方法を示します。

Java の抽象クラス コンストラクター

クラスが抽象であることを示すとき、それはインスタンス化できませんが、それはコンストラクターを持つことができないという意味ではありません。 抽象クラスは、2つの条件でコンストラクターを持つことができます。

  1. サブクラスのインスタンス化が完了する前に、抽象クラスのフィールドの初期化を実行したい場合。
  2. 抽象クラスで最終フィールドを定義したが、宣言で初期化されていない場合、コンストラクターを使用してこれらのフィールドを初期化できます。

コンストラクターを定義しない場合、JVM がデフォルトのコンストラクターを定義します。 コンストラクターを定義する前に、次の点を考慮する必要があります。

  1. サブクラスのコンストラクターは、抽象クラスから 1つのコンストラクターを呼び出すことができます。抽象クラスに引数コンストラクターがない場合は、それを呼び出す必要があります。
  2. public として定義しても利点がないため、すべてのコンストラクターを抽象クラスで保護されたものとして定義する必要があります。
  3. 異なる引数を持つ複数のコンストラクターを定義することもできます。

コンストラクターで抽象クラスを拡張することにより、総給与、税金、および正味給与を計算する抽象クラス コンストラクターの例を見てみましょう。

コード例:

package delftstack;

abstract class SalaryCal {
  double salary;
  protected SalaryCal() {
    salary = 0;
  }
  protected SalaryCal(double a) {
    salary = a;
  }
  // Calculate is now an abstract method
  abstract double Calculate();
}

class Salary extends SalaryCal {
  Salary(double a) {
    super(a);
  }
  // override calculate for Salary
  double Calculate() {
    System.out.println("Inside the Calculate method for Salary.");
    double allowance = salary * 0.1; // 10 Percent other allowances
    return salary + allowance;
  }
}

class Tax extends SalaryCal {
  Tax(double a) {
    super(a);
  }
  // override calculate for Tax
  double Calculate() {
    System.out.println("Inside the Calculate method for Tax.");
    return salary * 0.2; // 20 percent tax
  }
}

public class Abstract_Constructor {
  public static void main(String args[]) {
    // SalaryCal Demo = new SalaryCal(1000); // illegal now because we can not instantiate an object
    double Salary = 1000;
    Salary S = new Salary(Salary);
    Tax T = new Tax(Salary);

    SalaryCal Salary_Calculation; // this is OK, no object is created

    // Gross Salary Calculation
    Salary_Calculation = S;
    double gross_salary = Salary_Calculation.Calculate();
    System.out.println("The Gross Salary is " + gross_salary);

    // Tax Calculation
    Salary_Calculation = T;
    double salary_tax = Salary_Calculation.Calculate();
    System.out.println("The total Tax on Salary is " + salary_tax);

    // Net Salary
    double net_salary = gross_salary - salary_tax;
    System.out.println("The Net Salary is " + net_salary);
  }
}

スーパークラス SalaryCal は抽象宣言されており、2つのコンストラクターを持ちます。1つはデフォルトの引数なしで、もう 1つは引数付きです。 SalaryTax の 2つの具象クラスは、総給与と税金を計算します。

抽象コンストラクターは、給与計算によく使用されます。 main メソッドは、Abstract クラスをインスタンス化できないことも示しています。

抽象クラスを使用して、具象クラスから値を取得できます。

出力:

Inside the Calculate method for Salary.
The Gross Salary is 1100.0
Inside the Calculate method for Tax.
The total Tax on Salary is 200.0
The Net Salary is 900.0