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.)
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"); } }
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();
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
Person
har en subklass Student
, kan en student vara
cyklist?Hur? Hur borde man göra istället?
Jag fortsätter diskussionen om abstrakta klasser senare i detta avsnitt.
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.)
Vi talar om typen av en variabel och typen av ett objekt. Ett par enkla regler:
new
). Typen av ett
objekt ändras aldrig.Men en variabel av en viss typ kan bindas till objekt av olika typer.
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.