Polymorfi

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

Polymorfi

En variabel av klasstyp kan bindas till ett objekt av en subklass.

Exempel:

Fordon f = new Bil();

Enligt deklarationen av variabeln f måste f bindas till ett objekt av klassen Fordon. Om jag skapar ett objekt av klassen Bil kommer det förstås att tillhöra en klass en Bil (inte Fordon), men Java tillåter tilldelning även i det fallet.

(När jag vill vara noggrann skriver jag "ett objekt av klassen Bil". Men det blir tungrott i längden, så jag kommer att övergå till att säga "en bil" och lita på att läsaren förstår att jag pratar om objekt i en klass, inte riktiga bilar.)

Polymorfi...

Vi spinner vidare på fordonsexemplet. Målet är att visa vad polymorfi är och hur man kan använda det.

Vi utökar klassen Fordon med metoderna getToppfart() och beskriv().

class Fordon {
   double getToppfart() { };

   void beskriv() {
      System.out.println(
      "Detta fordon har toppfart "
      + getToppfart()+" km/h");
   }
}

Kod för att testa ...

Lite kod för att testa fordonsklasserna. Denna kod läggs lämpligtvis in i en main-metod.

Person p = new Person("Olle", 24);
Cykel c = new Cykel (p);
Bil b = new Bil (100, 4);

System.out.println("Cykel...");
c.beskriv();
System.out.println("Bil...");
b.beskriv();

Fordon f = new Cykel(new Person("Nisse", 99));
System.out.println("Fordon?...");
f.beskriv();

Körexempel

svenolof@harpo$ javac Fordonstest.java
svenolof@harpo$ java Fordonstest
Cykel...
Detta fordon har toppfart 30.0 km/h
Bil...
Detta fordon har toppfart 150.0 km/h
Fordon?...
Detta fordon har toppfart 10.0 km/h

Frågor

Jag fortsätter diskussionen om abstrakta klasser senare i detta avsnitt.

Implicit typkonvertering

Där ett objekt av klass K förväntas kan man använda ett objekt av en subklass till K.

Exempel:

Fordon f =
    new Cykel(new Person("Nisse", 99));

Notera att detta också innebär att om klassen Person har en subklass Student kan man ge en student som argument till konstruktorn. Så en student kan vara cyklist. (Prova gärna.)

Typer

Vi talar om typen av en variabel och typen av ett objekt. Ett par enkla regler:

Men en variabel av en viss typ kan bindas till objekt av olika typer.

Statiskt och Dynamiskt

Du har kanske noterat att vi har två sätt att resonera om typer i Java. Variabler har typer. Objekt har typer.

I exemplet ovan har variabeln f typen Fordon men det objekt som skapas har typen Cykel.

Vi talar om statiska typer hos variabler (denna information är känd vid kompilering) och dynamiska typer hos objekt (denna information är tillgänglig först vid körning).

Det här är inte så komplicerat men jag rekommenderar att du tar dig tid att tänka över problematiken.