Latest web development tutorials

Javaの抽象クラス

オブジェクト指向の概念では、すべてのオブジェクトが型によって記述されているが、逆に、全てのクラスは、クラスの特定を説明するための十分な情報が含まれていない場合、オブジェクトを、オブジェクトを記述するために使用されますそのようなクラスは抽象クラスです。

抽象クラスに加えて、他の機能のクラスはまだ存在して、メンバ変数、メソッドとメンバーのコンストラクタと同じ一般的なカテゴリにアクセスする方法をオブジェクトをインスタンス化することはできません。

抽象クラスは、オブジェクトをインスタンス化することはできませんので、抽象クラスを継承しなければならないので、それを使用することができます。 この理由のため、通常は設計段階で決定または抽象クラスを設計することはありません。

親クラスは、一般的なサブクラスのセットが含まれていますが、親クラスに、それ自体が抽象的であるため、あなたはこれらのメソッドを使用することはできません。


抽象型クラス

Java言語で抽象クラス抽象クラスを定義するために使用します。 以下の例:

/* 文件名 : Employee.java */
public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number)
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public double computePay()
   {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + this.name
       + " " + this.address);
   }
   public String toString()
   {
      return name + " " + address + " " + number;
   }
   public String getName()
   {
      return name;
   }
   public String getAddress()
   {
      return address;
   }
   public void setAddress(String newAddress)
   {
      address = newAddress;
   }
   public int getNumber()
   {
     return number;
   }
}

クラスは抽象クラスですが、それはまだ3メンバ変数、メソッド、およびコンストラクタの7人のメンバーを持っているが、Employeeクラスは、違いはありませんと指摘しました。 今、あなたは、次の例をしようとした場合:

/* 文件名 : AbstractDemo.java */
public class AbstractDemo
{
   public static void main(String [] args)
   {
      /* 以下是不允许的,会引发错误 */
      Employee e = new Employee("George W.", "Houston, TX", 43);

      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

あなたはAbstractDemoクラスをコンパイルしようとすると、それは次のようなエラーが生成されます。

Employee.java:46: Employee is abstract; cannot be instantiated
      Employee e = new Employee("George W.", "Houston, TX", 43);
                   ^
1 error

抽象クラスの継承

Employeeクラスによって継承された私たちの一般的なアプローチ:

/* 文件名 : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

私たちは、クラスEmployeeのオブジェクトをインスタンス化することはできませんが、我々は、Employeeクラス変数やメソッドの7人のメンバーの3メンバーから継承給与クラスのオブジェクトをインスタンス化する場合があります。

/* 文件名 : AbstractDemo.java */
public class AbstractDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();

      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

上記のプログラムは次のように結果がコンパイルされます。

Constructing an Employee
Constructing an Employee
Call mailCheck using  Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.

抽象法

あなたが特定のメンバメソッドを含むクラスを設計したい場合は、この方法の具体的な実装は、そのサブクラスによって決定され、その後、親クラスのメソッドが抽象メソッドで宣言することができます。

同様に抽象的なキーワードは、抽象メソッドを宣言するために使用することができ、抽象メソッドは、メソッド名、および無メソッド本体が含まれています。

抽象メソッドを直接代わりに中括弧のセミコロンを持つメソッド名の後ろ、定義されていません。

public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   
   //其余代码
}

以下の二つの結果になります抽象メソッドを宣言します。

  • クラスは抽象メソッドが含まれている場合は、クラスが抽象的でなければなりません。
  • すべてのサブクラスは、親クラスの抽象メソッドをオーバーライドする、または抽象自体を宣言する必要があります。

継承された抽象メソッドのサブクラスは、このメソッドをオーバーライドする必要があります。 それ以外の場合は、サブクラスは抽象クラスとして宣言する必要があります。 最終的には、オブジェクトをインスタンス化するために使用することはできません最終的な親クラスのサブクラスへの初期から、そうでない場合は、抽象メソッドを実装するためにサブクラスがなければなりません。

給与クラスはEmployeeクラスを継承する場合、それはcomputePay()メソッドを実装する必要があります。

/* 文件名 : Salary.java */
public class Salary extends Employee
{
   private double salary; // Annual salary
  
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }

   //其余代码
}