"Halo, Amigo! Kami punya topik baru yang menarik."

"Hari ini hanyalah hari dengan topik yang menarik!"

"Wah terima kasih!"

"Terima kasih kembali."

"Ingat saat kita memperkenalkan kelas dasar ChessItem untuk menyederhanakan semua kelas bidak catur?"

"Ya."

"Sekarang bayangkan setiap bagian memiliki metode yang menangani rendering bagian di layar. Anda memanggil metode dan bagian tersebut menggambar dirinya sendiri pada koordinatnya saat ini. Apakah akan membantu untuk memindahkan metode ini ke kelas dasar?"

"Ya." Setelah saya belajar tentang polimorfisme, saya akan dapat memanggil metode render untuk semua bagian, apa pun jenisnya. Sesuatu seperti ini:"

Misalnya:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  ArrayList <ChessItem> items = new ArrayList<ChessItem>();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  //draw them regardless of their type.
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

"Bagus sekali. Tepat sekali. Dan apa yang akan dilakukan dengan metode undian dari kelas ChessItem itu sendiri?"

"Saya tidak tahu. Catur tidak memiliki bidak seperti itu. Dan itu artinya tidak ada representasi visual."

"Tepat. Dan tidak masuk akal untuk membuat objek ChessItem. Tidak ada bidak catur seperti itu. Itu hanya abstraksi —sebuah kelas yang kami buat untuk kenyamanan. Begitulah cara abstraksi bekerja di OOP: kami memindahkan semua yang penting (berbagi oleh semua bagian) data dan metode ke dalam kelas dasar , tetapi kami menyimpan perbedaan mereka di kelas yang sesuai dengan bidak catur tertentu."

Java memiliki tipe kelas khusus untuk ini: kelas abstrak . Berikut adalah tiga hal yang perlu diingat tentang kelas abstrak.

1) Kelas abstrak dapat mendeklarasikan metode tanpa mengimplementasikannya. Metode seperti ini disebut metode abstrak.

Misalnya:
 public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) Metode abstrak ditandai dengan kata kunci abstract .

Jika suatu kelas bahkan memiliki satu metode abstrak, maka kelas tersebut juga ditandai dengan abstract .

3) Anda tidak dapat membuat objek dari kelas abstrak. Kode yang mencoba melakukannya tidak akan dikompilasi.

kode jawa Keterangan
ChessItem item = new ChessItem();
item.draw();
Kode ini tidak dapat dikompilasi.
ChessItem item = new Queen();
item.draw();
Tapi Anda bisa melakukan ini.

4) Jika kelas Anda mewarisi kelas abstrak, Anda perlu mengganti semua metode abstrak yang diwariskan, yaitu Anda harus mengimplementasikannya. Jika tidak, kelas Anda juga harus dinyatakan abstrak. Jika kelas memiliki bahkan satu metode yang tidak diimplementasikan yang dideklarasikan langsung di kelas atau diwarisi dari kelas induk, maka kelas tersebut dianggap abstrak.

"Tapi mengapa semua ini diperlukan? Mengapa kita membutuhkan kelas abstrak? Bukankah mungkin untuk menggunakan kelas biasa sebagai gantinya? Dan alih-alih metode abstrak, tidak bisakah kita membuat implementasi kosong yang terdiri dari tanda kurung kurawal buka dan tutup?"

"Bisa. Tapi batasan ini seperti privatepengubah. Kami menggunakan privatepengubah untuk sengaja memblokir akses langsung ke data, sehingga pemrogram lain dan kelas mereka menggunakan publicmetode kami."

Hal yang sama berlaku untuk kelas abstrak. Siapa pun yang menulis kelas tidak ingin siapa pun membuat instance kelas. Sebaliknya, penulis mengharapkan metode abstrak dari kelas abstraknya untuk diwariskan dan diganti.

"Saya masih tidak mengerti mengapa kami ingin mempersulit hidup kami dengan cara ini."

"Keuntungan dari fitur ini terbukti dalam proyek besar. Semakin banyak kelas yang Anda miliki, semakin jelas Anda perlu menggambarkan peran mereka. Anda akan melihat keuntungan melakukan ini, dan segera. Semua orang harus melalui ini."