"Hei, Amigo! Vi har et fascinerende nytt emne."

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

"Hvorfor, takk!"

"Værsågod."

"Husker du da vi introduserte ChessItem-basisklassen for å forenkle alle klassene for sjakkbrikker?"

"Ja."

"Tenk deg nå at hver brikke har en metode som håndterer å gjengi brikken på skjermen. Du kaller metoden og brikken tegner seg selv ved sine nåværende koordinater. Ville det være nyttig å flytte denne metoden inn i basisklassen?"

"Ja." Etter at jeg har lært om polymorfisme, vil jeg kunne kalle gjengivelsesmetoden for alle brikkene, uavhengig av type. Noe sånt 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 gjort. Akkurat. Og hva ville blitt gjort med trekningsmetoden til selve ChessItem-klassen?"

"Jeg vet ikke. Sjakk har ikke et slikt stykke. Og det betyr at det ikke har noen visuell representasjon."

"Nøyaktig. Og det gir ikke mening å lage et ChessItem-objekt. Det er ingen slik sjakkbrikke. Det er bare en abstraksjon — en klasse som vi har laget for enkelhets skyld. Det er slik abstraksjon fungerer i OOP: vi flyttet alle viktige (delte) av alle brikker) data og metoder i en basisklasse , men vi beholdt forskjellene deres i klassene tilsvarende spesifikke sjakkbrikker."

Java har en spesiell klassetype for dette: den abstrakte klassen . Her er tre ting å huske på om abstrakte klasser.

1) En abstrakt klasse kan deklarere metoder uten å implementere dem. En slik metode kalles 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 merket med søkeordet abstrakt .

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

3) Du kan ikke lage objekter av en abstrakt klasse. Kode som forsøker å gjøre det vil ganske enkelt ikke kompilere.

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

4) Hvis klassen din arver en abstrakt klasse, må du overstyre alle de nedarvede abstrakte metodene, dvs. du må implementere dem. Ellers må klassen din også erklæres abstrakt. Hvis klassen til og med har én uimplementert metode erklært direkte i klassen eller arvet fra den overordnede klassen, anses klassen som abstrakt.

"Men hvorfor er alt dette nødvendig? Hvorfor trenger vi abstrakte klasser? Er det ikke mulig å bruke vanlige klasser i stedet? Og i stedet for abstrakte metoder, kan vi ikke bare lage tomme implementeringer som består av å åpne og lukke krøllede parenteser?"

"Det kan du. Men disse begrensningene er som privatemodifikatoren. Vi bruker privatemodifikatoren for bevisst å blokkere direkte tilgang til data, slik at andre programmerere og deres klasser bruker publicmetodene våre."

Det samme gjelder for en abstrakt klasse. Den som skrev klassen vil ikke at noen skal lage forekomster av klassen. Tvert imot forventer forfatteren at de abstrakte metodene til hans eller hennes abstrakte klasse skal arves og overstyres.

"Jeg forstår fortsatt ikke hvorfor vi skulle ønske å komplisere livene våre på denne måten."

"Fordelen med denne funksjonen er tydelig i store prosjekter. Jo flere klasser du har, desto tydeligere trenger du å avgrense rollene deres. Du vil se fordelen med å gjøre dette, og snart. Alle må gjennom dette."