"Hello, Amigo! Kami ada topik baharu yang menarik."

"Hari ini hanyalah hari topik yang menarik!"

"Kenapa berterima kasih!"

"Sama-sama."

"Ingat ketika kami memperkenalkan kelas asas ChessItem untuk memudahkan semua kelas untuk buah catur?"

"Ya."

"Sekarang bayangkan bahawa setiap bahagian mempunyai kaedah yang mengendalikan pemaparan bahagian pada skrin. Anda memanggil kaedah dan kepingan itu melukis dirinya pada koordinat semasanya. Adakah berguna untuk memindahkan kaedah ini ke dalam kelas asas?"

"Ya." Selepas saya belajar tentang polimorfisme, saya akan dapat memanggil kaedah render untuk semua kepingan, tanpa mengira jenisnya. Sesuatu seperti ini:"

Sebagai contoh:
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();
  }
 }
}

"Syabas. Betul sekali. Dan apakah yang akan dilakukan dengan kaedah cabutan kelas ChessItem itu sendiri?"

"Saya tidak tahu. Catur tidak mempunyai bahagian seperti itu. Dan ini bermakna ia tidak mempunyai perwakilan visual."

"Tepat sekali. Dan tidak masuk akal untuk mencipta objek ChessItem. Tidak ada buah catur seperti itu. Ia hanya abstraksi —kelas yang kami buat untuk kemudahan. Begitulah cara abstraksi berfungsi dalam OOP: kami memindahkan semua yang penting (berkongsi oleh semua bahagian) data dan kaedah ke dalam kelas asas , tetapi kami mengekalkan perbezaannya dalam kelas yang sepadan dengan buah catur tertentu."

Java mempunyai jenis kelas khas untuk ini: kelas abstrak . Berikut adalah tiga perkara yang perlu diingat tentang kelas abstrak.

1) Kelas abstrak boleh mengisytiharkan kaedah tanpa melaksanakannya. Kaedah sedemikian dipanggil kaedah abstrak.

Sebagai contoh:
 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) Kaedah abstrak ditandakan dengan kata kunci abstrak .

Jika kelas mempunyai satu kaedah abstrak, maka kelas itu juga ditandakan dengan abstrak .

3) Anda tidak boleh mencipta objek kelas abstrak. Kod yang cuba berbuat demikian tidak akan disusun.

kod Java Penerangan
ChessItem item = new ChessItem();
item.draw();
Kod ini tidak akan disusun.
ChessItem item = new Queen();
item.draw();
Tetapi anda boleh melakukan ini.

4) Jika kelas anda mewarisi kelas abstrak, anda perlu mengatasi semua kaedah abstrak yang diwarisi, iaitu anda perlu melaksanakannya. Jika tidak, kelas anda juga perlu diisytiharkan sebagai abstrak. Jika kelas mempunyai walaupun satu kaedah yang tidak dilaksanakan yang diisytiharkan secara langsung dalam kelas atau diwarisi daripada kelas induk, maka kelas itu dianggap abstrak.

"Tetapi mengapa semua ini perlu? Mengapa kita memerlukan kelas abstrak? Bukankah mungkin untuk menggunakan kelas biasa sebaliknya? Dan bukannya kaedah abstrak, tidak bolehkah kita hanya mencipta pelaksanaan kosong yang terdiri daripada membuka dan menutup kurungan kerinting?"

"Anda boleh. Tetapi sekatan ini seperti privatepengubah suai. Kami menggunakan privatepengubah suai untuk sengaja menyekat akses terus kepada data, supaya pengaturcara lain dan kelas mereka menggunakan publickaedah kami."

Perkara yang sama berlaku untuk kelas abstrak. Sesiapa yang menulis kelas itu tidak mahu sesiapa pun mencipta tika kelas itu. Sebaliknya, penulis mengharapkan kaedah abstrak kelas abstraknya diwarisi dan ditindih.

"Saya masih tidak faham mengapa kita mahu merumitkan hidup kita dengan cara ini."

"Kelebihan ciri ini jelas dalam projek besar. Lebih banyak kelas yang anda ada, lebih jelas anda perlu menggambarkan peranan mereka. Anda akan melihat kelebihan melakukan ini, dan tidak lama lagi. Semua orang perlu melalui ini."