09 – arv og polymorfi i java

40
09 – Arv og polymorfi i java Hvordan arv og polymorfi implementeres i Java

Upload: traci

Post on 22-Feb-2016

63 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 09  –  Arv og  polymorfi  i  java

09 – Arv og polymorfi i javaHvordan arv og polymorfi implementeres i Java

Page 2: 09  –  Arv og  polymorfi  i  java

2NOEA 2009Java-kursus – Arv og polymorfi 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

Page 3: 09  –  Arv og  polymorfi  i  java

3NOEA 2009Java-kursus – Arv og polymorfi i java

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.

Page 4: 09  –  Arv og  polymorfi  i  java

4NOEA 2009Java-kursus – Arv og polymorfi i java

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 = "";

}. . . .

}

Page 5: 09  –  Arv og  polymorfi  i  java

5NOEA 2009Java-kursus – Arv og polymorfi i java

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”); }. . . .

}

Page 6: 09  –  Arv og  polymorfi  i  java

6NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 7: 09  –  Arv og  polymorfi  i  java

7NOEA 2009Java-kursus – Arv og polymorfi i java

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.

Page 8: 09  –  Arv og  polymorfi  i  java

8NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 9: 09  –  Arv og  polymorfi  i  java

9NOEA 2009Java-kursus – Arv og polymorfi i java

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() ...

Page 10: 09  –  Arv og  polymorfi  i  java

10NOEA 2009Java-kursus – Arv og polymorfi i java

Eksempel på klasse hierarki

Page 11: 09  –  Arv og  polymorfi  i  java

11NOEA 2009Java-kursus – Arv og polymorfi i java

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.

Page 12: 09  –  Arv og  polymorfi  i  java

12NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 13: 09  –  Arv og  polymorfi  i  java

13NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 14: 09  –  Arv og  polymorfi  i  java

14NOEA 2009Java-kursus – Arv og polymorfi i java

Eksempel forsat

Program flowet er:

Page 15: 09  –  Arv og  polymorfi  i  java

15NOEA 2009Java-kursus – Arv og polymorfi i java

“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");}

Page 16: 09  –  Arv og  polymorfi  i  java

16NOEA 2009Java-kursus – Arv og polymorfi i java

“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”);

}

Page 17: 09  –  Arv og  polymorfi  i  java

17NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 18: 09  –  Arv og  polymorfi  i  java

18NOEA 2009Java-kursus – Arv og polymorfi i java

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;

} }

Page 19: 09  –  Arv og  polymorfi  i  java

19NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 20: 09  –  Arv og  polymorfi  i  java

20NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 21: 09  –  Arv og  polymorfi  i  java

21NOEA 2009Java-kursus – Arv og polymorfi i java

Polymorfi?

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

Page 22: 09  –  Arv og  polymorfi  i  java

22NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 23: 09  –  Arv og  polymorfi  i  java

23NOEA 2009Java-kursus – Arv og polymorfi i java

Polymorfi Eksempel: Shape

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

Page 24: 09  –  Arv og  polymorfi  i  java

24NOEA 2009Java-kursus – Arv og polymorfi i java

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(); }

Page 25: 09  –  Arv og  polymorfi  i  java

25NOEA 2009Java-kursus – Arv og polymorfi i java

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;

} }

Page 26: 09  –  Arv og  polymorfi  i  java

26NOEA 2009Java-kursus – Arv og polymorfi i java

Eksempel: Polymorfi

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

Page 27: 09  –  Arv og  polymorfi  i  java

27NOEA 2009Java-kursus – Arv og polymorfi i java

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 );

}

Page 28: 09  –  Arv og  polymorfi  i  java

28NOEA 2009Java-kursus – Arv og polymorfi i java

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());

}

Page 29: 09  –  Arv og  polymorfi  i  java

29NOEA 2009Java-kursus – Arv og polymorfi i java

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 studentObject = new Student();Employee employeeObject = new Employee();

printInformation( studentObject );

printInformation( employeeObject );}

Page 30: 09  –  Arv og  polymorfi  i  java

30NOEA 2009Java-kursus – Arv og polymorfi i java

Fordele ved polymorfi

Forenkling I en familie af subklasser er det muligt at ignorere type-

specifikke 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å

Page 31: 09  –  Arv og  polymorfi  i  java

31NOEA 2009Java-kursus – Arv og polymorfi i java

Fordele ved polymorfi

Udvidelse Nye subklasser kan tilføjes familien på et senere tidspunkt,

og objekterne af disse klasser vil stadig fungere sammen med den eksisterende kode

Page 32: 09  –  Arv og  polymorfi  i  java

32NOEA 2009Java-kursus – Arv og polymorfi i java

3 former for polymorfi i et Java program

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

Om interfaces og abstrakte klasser senere

Page 33: 09  –  Arv og  polymorfi  i  java

33NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 34: 09  –  Arv og  polymorfi  i  java

34NOEA 2009Java-kursus – Arv og polymorfi i java

Type

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

Page 35: 09  –  Arv og  polymorfi  i  java

35NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 36: 09  –  Arv og  polymorfi  i  java

36NOEA 2009Java-kursus – Arv og polymorfi i java

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

Page 37: 09  –  Arv og  polymorfi  i  java

37NOEA 2009Java-kursus – Arv og polymorfi i java

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;

Page 38: 09  –  Arv og  polymorfi  i  java

38NOEA 2009Java-kursus – Arv og polymorfi i java

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;

}

Page 39: 09  –  Arv og  polymorfi  i  java

39NOEA 2009Java-kursus – Arv og polymorfi i java

Final klasser

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

Page 40: 09  –  Arv og  polymorfi  i  java

40NOEA 2009Java-kursus – Arv og polymorfi i java

Final Metoder

Metoder der ikke kan overskrives

public final [returnType] [methodName]([parameters]){. . .

}

Static metoder er automatisk final