"Hej, Amigo! Vi har ett fascinerande nytt ämne."

"Idag är bara en dag med fascinerande ämnen!"

"Varför tackar dig!"

"Varsågod."

"Kommer du ihåg när vi introducerade basklassen ChessItem för att förenkla alla klasser för schackpjäser?"

"Ja."

"Föreställ dig nu att varje pjäs har en metod som hanterar att rendera pjäsen på skärmen. Du anropar metoden och pjäsen ritar sig själv på sina nuvarande koordinater. Skulle det vara till hjälp att flytta denna metod till basklassen?"

"Ja." Efter att jag har lärt mig om polymorfism, skulle jag kunna kalla renderingsmetoden för alla bitar, oavsett deras typ. Något som det här:"

Till exempel:
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();
  }
 }
}

"Bra gjort. Exakt. Och vad skulle göras av själva lottningsmetoden för ChessItem-klassen?"

"Jag vet inte. Schack har inte en sådan pjäs. Och det betyder att den inte har någon visuell representation."

"Precis. Och det är inte meningsfullt att skapa ett ChessItem-objekt. Det finns inget sådant schackpjäs. Det är bara en abstraktion — en klass som vi gjort för bekvämlighets skull. Det är så abstraktion fungerar i OOP: vi flyttade alla viktiga (delade) av alla pjäser) data och metoder i en basklass , men vi behöll deras skillnader i klasserna som motsvarar specifika schackpjäser."

Java har en speciell klasstyp för detta: den abstrakta klassen . Här är tre saker att komma ihåg om abstrakta klasser.

1) En abstrakt klass kan deklarera metoder utan att implementera dem. En sådan metod kallas en abstrakt metod.

Till exempel:
 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) En abstrakt metod markeras med sökordet abstrakt .

Om en klass har en enda abstrakt metod, är klassen också markerad med abstrakt .

3) Du kan inte skapa objekt av en abstrakt klass. Kod som försöker göra det kommer helt enkelt inte att kompilera.

Java-kod Beskrivning
ChessItem item = new ChessItem();
item.draw();
Den här koden kommer inte att kompileras.
ChessItem item = new Queen();
item.draw();
Men du kan göra det här.

4) Om din klass ärver en abstrakt klass måste du åsidosätta alla nedärvda abstrakta metoder, dvs du måste implementera dem. Annars måste din klass också förklaras abstrakt. Om klassen ens har en oimplementerad metod deklarerad direkt i klassen eller ärvd från den överordnade klassen, anses klassen vara abstrakt.

"Men varför är allt detta nödvändigt? Varför behöver vi abstrakta klasser? Är det inte möjligt att använda vanliga klasser istället? Och istället för abstrakta metoder, kan vi inte bara skapa tomma implementeringar som består av att öppna och stänga krulliga parenteser?"

"Det kan du. Men dessa begränsningar är som privatemodifieraren. Vi använder privatemodifieraren för att medvetet blockera direktåtkomst till data, så att andra programmerare och deras klasser använder våra publicmetoder."

Detsamma gäller för en abstrakt klass. Den som skrev klassen vill inte att någon ska skapa instanser av klassen. Tvärtom förväntar sig författaren att de abstrakta metoderna i hans eller hennes abstrakta klass ärvs och åsidosätts.

"Jag förstår fortfarande inte varför vi skulle vilja komplicera våra liv på det här sättet."

"Fördelen med den här funktionen är uppenbar i stora projekt. Ju fler klasser du har, desto tydligare behöver du avgränsa deras roller. Du kommer att se fördelen med att göra det här, och snart. Alla måste gå igenom det här."