"Hej, Amigo! Vi har et fascinerende nyt emne."

"I dag er bare en dag med fascinerende emner!"

"Hvorfor, tak!"

"Selv tak."

"Husk da vi introducerede ChessItem-basisklassen for at forenkle alle klasser for skakbrikker?"

"Ja."

"Forestil dig nu, at hver brik har en metode, der håndterer gengivelse af brikken på skærmen. Du kalder metoden, og brikken tegner sig selv ved sine nuværende koordinater. Ville det være nyttigt at flytte denne metode ind i basisklassen?"

"Ja." Efter at jeg har lært om polymorfi, ville jeg være i stand til at kalde gengivelsesmetoden for alle stykkerne, uanset deres type. Noget som dette:"

For eksempel:
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();
  }
 }
}

"Godt klaret. Præcis. Og hvad ville der blive gjort ved selve ChessItem-klassens lodtrækningsmetode?"

"Jeg ved det ikke. Skak har ikke sådan et stykke. Og det betyder, at det ikke har nogen visuel repræsentation."

"Nøjagtigt. Og det giver ikke mening at skabe et ChessItem-objekt. Der findes ikke sådan en skakbrik. Det er kun en abstraktion — en klasse, som vi har lavet for nemheds skyld. Det er sådan abstraktion fungerer i OOP: vi flyttede alt det vigtige (delte) af alle brikker) data og metoder i en basisklasse , men vi beholdt deres forskelle i klasserne svarende til specifikke skakbrikker."

Java har en speciel klassetype til dette: den abstrakte klasse . Her er tre ting at huske om abstrakte klasser.

1) En abstrakt klasse kan erklære metoder uden at implementere dem. Sådan en metode kaldes en abstrakt metode.

For eksempel:
 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 metode er markeret med søgeordet abstrakt .

Hvis en klasse kun har én abstrakt metode, er klassen også markeret med abstrakt .

3) Du kan ikke oprette objekter af en abstrakt klasse. Kode, der forsøger at gøre det, vil simpelthen ikke kompilere.

Java kode Beskrivelse
ChessItem item = new ChessItem();
item.draw();
Denne kode vil ikke kompilere.
ChessItem item = new Queen();
item.draw();
Men du kan gøre dette.

4) Hvis din klasse arver en abstrakt klasse, skal du tilsidesætte alle de nedarvede abstrakte metoder, dvs. du skal implementere dem. Ellers skal din klasse også erklæres abstrakt. Hvis klassen har blot én uimplementeret metode, der er erklæret direkte i klassen eller arvet fra den overordnede klasse, betragtes klassen som abstrakt.

"Men hvorfor er alt dette nødvendigt? Hvorfor har vi brug for abstrakte klasser? Er det ikke muligt at bruge almindelige klasser i stedet? Og i stedet for abstrakte metoder, kan vi ikke bare lave tomme implementeringer, der består af at åbne og lukke krøllede parenteser?"

"Det kunne du. Men disse begrænsninger er ligesom privatemodifikatoren. Vi bruger privatemodifikatoren til bevidst at blokere direkte adgang til data, så andre programmører og deres klasser bruger vores publicmetoder."

Det samme gælder for en abstrakt klasse. Den, der har skrevet klassen, ønsker ikke, at nogen skal oprette forekomster af klassen. Tværtimod forventer forfatteren, at hans eller hendes abstrakte klasses abstrakte metoder nedarves og tilsidesættes.

"Jeg forstår stadig ikke, hvorfor vi ønsker at komplicere vores liv på denne måde."

"Fordelen ved denne funktion er tydelig i store projekter. Jo flere klasser du har, jo mere klart skal du afgrænse deres roller. Du vil se fordelen ved at gøre dette, og snart. Alle skal igennem dette."