Kelas abstrak Java



Dalam konsep berorientasikan objek, semua objek diwakili oleh kelas, tetapi sebaliknya, tidak semua kelas digunakan untuk menerangkan objek Jika kelas tidak mengandungi kelas yang mengandungi maklumat yang mencukupi untuk menerangkan a objek tertentu ialah kelas abstrak.

Kecuali kelas abstrak tidak boleh membuat instantiat objek, fungsi kelas lain masih wujud Pembolehubah ahli, kaedah ahli dan pembina boleh diakses dengan cara yang sama seperti kelas biasa.

Memandangkan kelas abstrak tidak boleh membuat instantiate objek, kelas abstrak mesti diwarisi sebelum ia boleh digunakan. Atas sebab ini, ia biasanya diputuskan semasa peringkat reka bentuk sama ada untuk mereka bentuk kelas abstrak.

Kelas induk mengandungi kaedah biasa untuk koleksi subkelas, tetapi kerana kelas induk itu sendiri adalah abstrak, kaedah ini tidak boleh digunakan.


Kelas abstrak

Gunakan kelas abstrak dalam bahasa Java untuk mentakrifkan kelas abstrak. Contoh berikut:

/* 文件名 : 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;
   }
}

Perhatikan bahawa kelas Pekerja tidak berbeza Walaupun kelas itu adalah kelas abstrak, ia masih mempunyai 3 pembolehubah ahli, 7 kaedah ahli dan 1 pembina. Sekarang jika anda mencuba contoh berikut:

/* 文件名 : 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();
    }
}

Apabila anda cuba menyusun kelas AbstractDemo, ralat berikut akan dihasilkan:

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

Mewarisi kelas abstrak

Kita boleh lulus Kaedah umum adalah untuk mewarisi kelas Pekerja:

/* 文件名 : 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;
   }
}

Walaupun kita tidak boleh membuat instantiate objek kelas Pekerja, jika kita membuat instantiate objek kelas Gaji, objek akan mewarisi 3 pembolehubah ahli dan 7 ahli daripada kaedah kelas Pekerja.

/* 文件名 : 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();
    }
}

Hasil penyusunan dan menjalankan program di atas adalah seperti berikut:

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.

Kaedah abstrak

Jika anda ingin mereka bentuk kelas sedemikian, yang mengandungi kaedah ahli khas, pelaksanaan khusus kaedah ditentukan oleh subkelasnya, maka anda boleh mengisytiharkan kaedah sebagai kaedah abstrak dalam kelas induk.

Kata kunci Abstrak juga boleh digunakan untuk mengisytiharkan kaedah abstrak hanya mengandungi nama kaedah dan tiada isi kaedah.

Kaedah abstrak tidak ditakrifkan dan nama kaedah diikuti terus oleh koma bertitik dan bukannya pendakap kerinting.

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

Mengisytiharkan kaedah abstrak akan menghasilkan dua keputusan berikut:

  • Jika kelas mengandungi kaedah abstrak, maka kelas itu mestilah abstrak.

  • Mana-mana subkelas mesti mengatasi kaedah abstrak kelas induk atau mengisytiharkan dirinya sebagai kelas abstrak.

Subkelas yang mewarisi kaedah abstrak mesti mengatasi kaedah ini. Jika tidak, subkelas juga mesti diisytiharkan abstrak. Akhirnya, subkelas mesti melaksanakan kaedah abstrak, jika tidak, kelas induk awal mahupun subkelas akhir tidak boleh digunakan untuk membuat instantiate objek.

Jika kelas Gaji mewarisi kelas Pekerja, maka ia mesti melaksanakan kaedah 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;
   }

   //其余代码
}