09-JavaArvPolymorfi

Download Report

Transcript 09-JavaArvPolymorfi

09 – Arv og polymorfi i java
Hvordan arv og polymorfi implementeres i Java
Opsummering af arv



NOEA
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
Java-kursus – Arv og polymorfi i java
2009
2
Why Inheritance? Reusability

NOEA
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.
Java-kursus – Arv og polymorfi i java
2009
3
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 = "";
}
....
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
4
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”);
}
....
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
5
Hvad bliver arvet is subklassen?


NOEA
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
Java-kursus – Arv og polymorfi i java
2009
6
Hvad kan gøres med attributter?




NOEA
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.
Java-kursus – Arv og polymorfi i java
2009
7
Hvad kan gøres med metoder?




NOEA
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
Java-kursus – Arv og polymorfi i java
2009
8
Object klassen


NOEA
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()
 ...
Java-kursus – Arv og polymorfi i java
2009
9
Eksempel på klasse hierarki
NOEA
Java-kursus – Arv og polymorfi i java
2009
10
Super klasse & sub klasse


NOEA
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.
Java-kursus – Arv og polymorfi i java
2009
11
Kald af konstruktøren i super klassen



NOEA
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
Java-kursus – Arv og polymorfi i java
2009
12
Eksempel: Super’s default konstruktør kaldes implicit

I student eksemplet fra før:

public static void main( String[] args ){
Student anna = new Student();
}
Outputtet
er:
Inside Person:Constructor
Inside Student:Constructor
NOEA
Java-kursus – Arv og polymorfi i java
2009
13
Eksempel forsat

NOEA
Program flowet er:
Java-kursus – Arv og polymorfi i java
2009
14
“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");
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
15
“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”);
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
16
Overriding metoder




NOEA
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
Java-kursus – Arv og polymorfi i java
2009
17
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;
}
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
18
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
NOEA
Java-kursus – Arv og polymorfi i java
2009
19
Access modifiers i overriding metoder


NOEA
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
Java-kursus – Arv og polymorfi i java
2009
20
Polymorfi?

•
NOEA
Polymorfi i et Java program
 Evnen til at en reference variabel kan ændre opførsel i
forhold til hvilket objekt den peger på.
 Dette gør at objekter af forskellige subklasser kan
håndtereres som om de var en instans af super klassen
 Man siges at objektet af subklassen substitueres ind på
superklassens sted
Der kommer mere polymorfi senere
Java-kursus – Arv og polymorfi i java
2009
21
Eksempel: Runtime Polymorfi
Code:
Person person2 = new Student();
person2.myMethod("test4");
Person person3 = new InternationalStudent();
person3.myMethod("test5");
Result:
myMethod(test4) in Student class is called
myMethod(test5) in InternationalStudent class is called
NOEA
Java-kursus – Arv og polymorfi i java
2009
22
Polymorfi Eksempel: Shape



NOEA
Givet en basis klasse shape. Her giver polymorfi mulighed
for at implementere forskellige area() metoder for
forskellige afledte klasser, f.eks cirkel, rektangel og trekant
Area() metoden er implementeret forskelligt afhængig af
geometri
Men ligegyldigt hvilken slags shape et objekt er, vil
area()give det rigtige resultat
Java-kursus – Arv og polymorfi i java
2009
23
Eksempel: Polymorfi

Student og Employee arver begge fra Person
public static main( String[] args ) {
Student studentObject = new Student();
Employee employeeObject = new Employee();
Person ref = studentObject; // Person reference points
// to a Student object
// Calling getName() of the Student object instance
String name = ref.getName();
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
24
Eksempel: Polymorfi

Student og Employee overskriver nu begge getName()
public class Student {
public String getName(){
System.out.println(“Student Name:” + name);
return name;
}
}
public class Employee {
public String getName(){
System.out.println(“Employee Name:” + name);
return name;
}
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
25
Eksempel: Polymorfi


NOEA
I main metoden fra før, Student’s getName() metode blive
kaldt
Og hvis vi sætter ref til at pege på et Employee objekt vil
Employee’s getName() metode blive kaldt
Java-kursus – Arv og polymorfi i java
2009
26
Eksempel: Polymorfi
public static main( String[] args ) {
Student studentObject = new Student();
Employee employeeObject = new Employee();
Person ref = studentObject; //Person ref. points to a Student object
// getName() method of Student class is called
String temp= ref.getName();
System.out.println( temp );
ref = employeeObject; //Person ref. points to Employee object
//getName() method of Employee class is called
String temp = ref.getName();
System.out.println( temp );
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
27
Eksempel: Polymorfi

Nu har vi en static metode ‘printInformation’ der tager en
Person reference som parameter.
public static printInformation( Person p ){
System.out.println(p.getName());
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
28
Eksempel: Polymorfi

Vi kan overføre referencer af typen Employee og typen
Student til printInformation metoden sålænge de arver fra
Person.
public static main( String[] args ){
Student
Employee
studentObject = new Student();
employeeObject = new Employee();
printInformation( studentObject );
printInformation( employeeObject );
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
29
Fordele ved polymorfi

NOEA
Forenkling
 I en familie af subklasser er det muligt at ignorere typespecifikke detaljer og kun interagere med superklassen
 Selv om man i koden betragter en reference som et objekt af
superklassen, så kan det ivirkelighed være superklassen
eller en af dens arvninger
 Dette gør lettere at skrive, og lettere at forstå
Java-kursus – Arv og polymorfi i java
2009
30
Fordele ved polymorfi

NOEA
Udvidelse
 Nye subklasser kan tilføjes familien på et senere tidspunkt,
og objekterne af disse klasser vil stadig fungere sammen
med den eksisterende kode
Java-kursus – Arv og polymorfi i java
2009
31
3 former for polymorfi i et Java program



NOEA
Metode overriding
 Metoder af en subklasse overskriver metoderne af
superklasse
Metode overriding (implementation) af abstract metoder
 Abstrakte metoder er metoder,der er angivet, men ikke
implementeret i super klassen. Der skal derfor være en
subklasse, der implementerer metoden
Metode overriding (implementation) af Java interface
 Metoder i en konkret klasse implementerer metoderne i et
interface
Java-kursus – Arv og polymorfi i java
2009
32
Hiding metoder


Hvis en subklasse omdefinerer en klasse metode (static) med
samme signatur som super klassen kaldes det hiding, dvs.
den skjuler super klassens metode.
Det ligner metode overskrivning, men det er det ikke:

Ved metode overskrivning er der dynamisk binding, dvs. at
hvis et objekt af en subklasse sættes ind på superklassens
plads, så bliver subklassens metode kørt

Ved metode hiding er det statisk binding. Dvs. at i ovennævnte
situation vil superklassens metode blive kørt
Demo
NOEA
Java-kursus – Arv og polymorfi i java
2009
33
Type



NOEA
En instans af en given type kan bruges de steder hvor typen
eller suppertypen er erklæret
Eksempel:
 student1 objektet en “type” af CsStudent, Student, og Person
 student1 objektet kan bruges de steder hvor der er erklæret en
instans af CsStudent, Student, eller Person.
Dette giver mulighed for polymorfi
Java-kursus – Arv og polymorfi i java
2009
34
Implicit Type Casting



Et objekt af en subklasse kan tildeles en variabel, der er
erklæret som en parent
Dette gøres implicit fordi objektet er en slags af parent
Eksempel
 Student klassen arver fra Person klassen
 CsStudent klassen arver fra Student klassen
CsStudent csStudent = new CsStudent();
Student student = csStudent; // Implicit type casting
Person person = csSstudent; // Implicit type casting
Object object = tuftsstudent; // Implicit type casting
NOEA
Java-kursus – Arv og polymorfi i java
2009
35
Explicit Type Casting


Et objekt af en superklasse kan tildeles en variabel, der er
erklæret som en subklasse gennem eksplicit type casting.
En superklasse er ikke en slags subklasse, f.eks er et
pattedyr ikke en slags hund
 At undlade casting vil medføre en kompileringsfejl
 Compiler vil gennem casting sikre at du ved det er en slags
hund
Person person1 = new Student();
Student student1 = (Student) person1; // Explicit type casting
NOEA
Java-kursus – Arv og polymorfi i java
2009
36
Runtime Type Mismatch Exception


Selv man bruger casting, kan der stadig komme runtime fejl
Example
 Student og Teacher arver begge fra Person
Person person1 = new Student();
Person person2 = new Teacher();
Student student1 = (Student) person1; // Explicit type casting
// No compile error, but runtime type mismatch exception
Student student2 = (Student) person2;
NOEA
Java-kursus – Arv og polymorfi i java
2009
37
Brug instanceof til at forhindre runtime fejl
Person person1 = new Student();
Person person2 = new Teacher();
// Do the casting only when the type is verified
if (person2 instanceof Student) {
Student student2 = (Student) person2;
}
NOEA
Java-kursus – Arv og polymorfi i java
2009
38
Final klasser




NOEA
Klasser der ikke kan arves fra
For at erklære final klasser, skriv:
public final ClassName{
. . .
}
Eksempler på klasser i Java api’et er String og wrapper
klasser f.eks Integer.
Man kan ikke arve fra String
Java-kursus – Arv og polymorfi i java
2009
39
Final Metoder

Metoder der ikke kan overskrives
public final [returnType] [methodName]([parameters]){
. . .
}

Static metoder er automatisk final
NOEA
Java-kursus – Arv og polymorfi i java
2009
40