09 – Arv og polymorfi i javaHvordan arv og polymorfi implementeres i Java
09 – Arv og polymorfi i java
Hvordan arv og polymorfi implementeres i Java
Opsummering af arv
Arv er det at en subklasse arver metoder og variable som er defineret i superklassen Genbrug er en af de store fordele ved arv En subklasse behøver kun at implementere det der adskiller den fra super klassen
Why Inheritance? Reusability
Benefits of Inheritance in OOP : Reusability Once a behavior (method) is defined in a super class, that behavior is automatically inherited by all subclasses Thus, you write a method only once and it can be used by all subclasses. Once a set of properties (fields) are defined in a super class, the same set of properties are inherited by all subclasses A class and its children share common set of properties A subclass only needs to implement the differences between itself and the parent.
extends keyword
extends bliver brugt til at angive at klassen arver fra en anden Eksempel, her en parent eller superklasse Person: public class Person { protected String name; protected String address; public Person(){ System.out.println(“Inside Person:Constructor”); name = ""; address = ""; } . . . . }
extends keyword
Opretter nu en Student klasse Da Student “er-en” slags Person, kan vi arve fra Person og genbruge name og address: public class Student extends Person { public Student(){ System.out.println(“Inside Student:Constructor”); } . . . . }
Hvad bliver arvet is subklassen?
Subklassen arver alle “public” og “protected” medlemmer (attributter og metoder) fra dens parent, uanset hvilken pakke den er i. Hvis subklassen er i samme pakke, arver den også pakke specifikke medlemmer, dvs. dem der ikke angivet en access modifier
Hvad kan gøres med attributter?
De nedarvede attributter kan bruges direkte Subklassen kan udvides med attributter, der ikke er i superklassen Der kan erklæres en attribut med samme navn i subklassen som i superklassen. Derved skjules superklassens attribut. (dette kan ikke anbefales) En subklasse arver ikke private attributter, men hvis en public eller protected metode tilgår atttributten kan den stadig bruges.
Hvad kan gøres med metoder?
De nedarvede metoder kan bruges som de er Der kan skrives en ny instans metode med samme signatur som superklassens metode. Derved overskrives / omdefineres metoden Der kan skrives en ny static metode i subklassen med samme signatur somsuperklassens. På den måde skjules superklassens metode Subklassen kan udvides med nye metoder, der ikke er i superklassen
Object klassen
Object klassen er superklasse for alle klasser I Java arver alle klasser fra Object klassen Object klassen er derfor den eneste klasse der ikke har en forældre Den definerer og implementer adfærd der er fælles for alle klasser inklusiv dem man selv skriver getClass() equals() toString() ...
Eksempel på klasse hierarki
Super klasse & sub klasse
Super klasse (Parent) Klasser, der ligger over en specifik klasse i klasse hierarkiet. Sub klasse (Child) Klasser, der ligger under en specifik klasse i klasse hierarkiet.
Kald af konstruktøren i super klassen
En subklasse’s konstruktør kalder implicit default konstruktøren i super klassen En subklasse’s konstruktør kan eksplicit kalde konstruktøren i super klassen ved at bruge super super kan kaldes med parametre
Eksempel: Super’s default konstruktør kaldes implicit
I student eksemplet fra før: Outputtet er: public static void main( String[] args ){ Student anna = new Student(); } Inside Person:Constructor Inside Student:Constructor
Eksempel forsat
Program flowet er:
“super” keyword
En subklasse kan eksplicit kalde en konstruktør i dens umiddelbare super klasse. Dette gøres med super(parameterliste). Hvilken konstruktør der kaldes afhænger af parametrene super(..) skal komme som det første statement i konstruktøren super(..) kan kun forekomme i konstruktøren public Student(){ super( "SomeName", "SomeAddress" ); System.out.println("Inside Student:Constructor"); }
“super” keyword
En anden anvendelse af super er at referere til medlemmer af super klassen (lidt på samme måde som med this) public Student() { super.name = “somename”; super.setAddress(“some address”); }
Overriding metoder
En afledt klasse (subklasse) kan overskrive (overriding på engelsk) en instans metode i superklassen. Bemærk: Overriding henfører til instans metoder For static metoder kaldes det metode hiding Den overskrivende metode skal have samme navn, parameterliste og returtype (altså signatur) som den metode den overskriver Dog kan den overskrivende metode returnere en subtype af den type som returneres af den overskrivne metode Bemærk at fra Java 1.5+ skal keyword’et @Overwrite bruges ved overskrivning
Eksempel: Overriding metoder
Der er følgende metode i super klassen Person: public class Person { : : public String getName(){ System.out.println("Parent: getName"); return name; } }
Eksempel: Overriding metoder
For at overskrive metoden i subklassen skrives en ny metode med samme signatur public class Student extends Person{ : public @Override String getName(){ System.out.println("Student: getName"); return name; } : } Output: Student: getName
Access modifiers i overriding metoder
Access modifier’en kan tillade mere, men ikke mindre end access modifieren i super klassen F.eks kan protected instans metode i super klassen blive public i sub klassen, men ikke private. Brud på dette vil give compileringsfejl
Comments