JAVAの抽象類について詳しく説明します


オブジェクト指向の概念では、すべてのオブジェクトはクラスで描かれていますが、逆に、すべてのクラスがオブジェクトを描くために使用されているわけではありません。一つのクラスに十分な情報が含まれていないなら、具体的なオブジェクトを描くという種類は抽象的です。
抽象類は対象を具体化できない以外にも、クラスの他の機能は依然として存在しています。メンバー変数、メンバー方法、構造方法のアクセス方法は普通のクラスと同じです。
抽象類は対象を具体化できないので、抽象類は引き継がれなければ使用できない。このため、デザイン段階で抽象的なデザインをするかどうかを決めるのが普通です。
親類には、子集合の一般的な方法が含まれていますが、父類自体は抽象的なので、これらの方法は使えません。
Javaで抽象的なクラス表現は継承関係であり、一つのクラスは抽象的なクラスしか継承できないが、一つのクラスは複数のインターフェースを実現できる。
抽象類
Java言語では、abstract classを使用して抽象クラスを定義します。以下の例:

/*     : 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;
  }
}
このEmployee類には特に違いがありません。抽象的なクラスですが、3つのメンバー変数、7つのメンバー方法、1つの構成方法があります。今は次のような例を試してみます。

/*     : AbstractDemo.java */
public class AbstractDemo
{
  public static void main(String [] args)
  {
   /*        ,      */
   Employee e = new Employee("George W.", "Houston, TX", 43);
 
   System.out.println("
Call mailCheck using Employee reference--"); e.mailCheck(); } }
AbstractDemoクラスをコンパイルしようとすると、次のようなエラーが発生します。
Employee.java:46:Employee is abstract;cannot be instantiated
      Employee=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クラスのオブジェクトを実装することはできませんが、Salaryクラスのオブジェクトを実装すると、オブジェクトは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("
Call mailCheck using Employee reference--"); e.mailCheck(); } }
以上のプログラムのコンパイルの結果は以下の通りです。
Costructing an Employee
Costructing an Employee
Call mail Check using  Salary reference--
Within mail Check of Salary class
Mailing check to Mohd Mohd Mohshim with salary 3600.0
Call mail Check using Employee reference--
Within mail Check of Salary class
Mailing check to John Adams with salary 2400.
抽象的な方法
このようなクラスを設計したいならば、このクラスには特別なメンバー方法が含まれています。この方法の具体的な実現はそのサブクラスによって決定されます。
Abstractキーワードは同様に抽象的な方法を声明するために用いられます。抽象的な方法は一つの方法名だけを含んでいます。
抽象的な方法は定義されていません。メソッド名の後に直接、括弧ではなく、記号を付けます。

public abstract class Employee
{
  private String name;
  private String address;
  private int number;
  
  public abstract double computePay();
  
  //    
}
抽象的な方法を宣言すると、次の二つの結果が出ます。
  • クラスが抽象的な方法を含む場合、クラスは抽象的なクラスでなければならない。
  • どのサブクラスも親の抽象的な方法を書き換えなければならない。
  • 抽象的な方法を受け継ぐサブクラスはこの方法を書き直さなければならない。そうでなければ、サブクラスも抽象クラスとして宣言しなければなりません。最終的には、この抽象的な方法を実現するためのサブクラスが必要です。そうでないと、最初の親から最終的なサブクラスまでは、オブジェクトを実用化するためには使用できません。
    もしSalary類がEmployee類を継承したら、computtePay()方法を実現しなければなりません。
    
    /*     : 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;
      }
     
      //    
    }
    抽象類総括規定
    1.抽象類は実用化されない(初心者が陥りやすいミス)ため、もし実用化されたら、エラーが発生し、コンパイルが通らない。オブジェクトを作成できるのは、抽象的でないサブクラスだけです。
    2.抽象類には必ずしも抽象的な方法が含まれていないが、抽象的な方法がある類は必ず抽象的な類である。
    3.抽象的な類の中の抽象的な方法は声明だけであり、方法体を含まない。方法の具体的な実現、すなわち方法の具体的な機能を与えないことである。
    4.構造方法、類方法(staticで修飾する方法)は抽象的な方法とは言えない。
    5.抽象類のサブクラスは抽象類における抽象的な方法の具体的な実現を与えなければならない。
    以上はJAVA抽象類の詳しい内容を詳しく説明しました。JAVA抽象類に関する資料は他の関連記事に注目してください。