primitiva typer Typecasting - klasstyper 8.Improving structure with

Typkonvertering
Typecasting - primitiva typer
• Implicit
Typecasting - klasstyper
double result;
int count, total;
…
//count & total har fått värden
…
result = (double)total/count;
– Vid tilldelning
– I aritmetiska uttryck
• Explicit ! Casting
– Om konvertering är möjlig
– Operator
(type) value
– Cast har hög prioritet
(Lägst av de unära, se app.D)
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
1
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
2
public class Auction
{
// The list of Lots in this auction.
private ArrayList lots;
Vilken typ har
…
elementen?
public Lot getLot(int number)
{
if((number >= 1) && (number < nextLotNumber))
{
// The number seems to be reasonable.
Lot selectedLot = (Lot) lots.get(number-1);
…
}
…
Returnerar en
Anger att
}//getLot
referens till ett
referensen skall
…
”Object”
tolkas som Lot
}//Auction
Objects
First
with
Java
A
Practical
Introduction
using
BlueJ,
©
David
J.
Barnes,
Michael
Kölling
Kap.8
Innehåll
Objects First With Java
A Practical Introduction Using BlueJ
3
Exemplet DoME
"Database of Multimedia Entertainment"
8.Improving structure with
inheritance
•
•
•
•
• Lagra info om CD-skivor och video
Arv
Subtyping
Substitution
Polymorfi
– CD: titel, artist, #spår, speltid, innehav,
kommentar
– Video: titel, regissör, speltid, innehav,
kommentar
• Möjliggör t.ex. sökning i och listning av
innehåll
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
5
Kap.8
DoME–klasser
DoME–objekt
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
6
DoME–objektmodell
övre halvan
visar attributen
nedre halvan
visar metoderna
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
7
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
8
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
9
Klassdiagram
public class CD
{
private String title;
private String artist;
private String comment;
CD källkod
Video
källkod
CD(String theTitle, String theArtist)
{
title = theTitle;
artist = theArtist;
comment = " ";
}
[
]
[
void setComment(String newComment)
{ ... }
ofullständigt
(kommentarer!)
public class Video
{
private String title;
private String director;
private String comment;
Video(String theTitle, String theDirect)
{
title = theTitle;
director = theDirect;
comment = " ";
}
]
void setComment(String newComment)
{ ... }
ofullständigt
(kommentarer!)
String getComment()
{ ... }
String getComment()
{ ... }
void print()
{ ... }
...
void print()
{ ... }
...
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
class Database
{
private ArrayList cds;
private ArrayList videos;
...
10
}
Kap.8
12
Arv
- Dubletter av kod även i Database
13
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
14
Kap.8
Arvshierarkier
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
public class Item
{
...
}
public class CD extends Item
{
...
}
16
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
15
Arv i Java
• definiera en superklass : Item
• definiera subklasser för Video och CD
• superklassen definierar gemensamma
attribut
• subklasserna ärver superklassens
attribut
• subklasserna lägger till egna attribut
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
!CD och Video liknar varandra, stora delar
identiska
!Mer jobb med underhåll
!Risk för att fel introduceras
Att använda arv
Kap.8
}
Kap.8
+ Strukturerna definierade
- Samma kod på flera ställen
for(Iterator iter = videos.iterator(); iter.hasNext(); )
{
Video video = (Video)iter.next();
video.print();
System.out.println();
// empty line between items
}
}//list
}//Database
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
11
+ och - DoME
Database
källkod
public void list()
{
for(Iterator iter = cds.iterator(); iter.hasNext(); )
{
CD cd = (CD)iter.next();
cd.print();
System.out.println();
// empty line between items
}
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
17
Kap.8
no
change
here
ingen
ändring
här
ändring här
change
here
public class Video extends Item
{
...
}
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
18
Superklass/basklass
Subklasser
public class Item
{
private String title;
private int playingTime;
private boolean gotIt;
private String comment;
public class CD extends Item
{
private String artist;
private int numberOfTracks;
public class Item
{
private String title;
private int playingTime;
private boolean gotIt;
private String comment;
/**
* Initialise the fields of the item.
*/
public Item(String theTitle, int time)
{
title = theTitle;
playingTime = time;
gotIt = false;
comment = "";
}
// constructors and methods omitted.
}
public class Video extends Item
{
private String director;
// constructors and methods omitted.
}
Arv och
konstruktorer
// constructors and methods omitted.
}
// methods omitted
}
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
public class CD extends Item
{
private String artist;
private int numberOfTracks;
19
Arv och
konstruktorer
/**
* Constructor for objects of class CD
*/
public CD(String theTitle, String theArtist,
int tracks, int time)
{
super(theTitle, time);
”super” betyder
artist = theArtist;
konstruktorn i
numberOfTracks = tracks;
superklassen med
}
denna
parameterlista
// methods omitted
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
20
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Anrop av basklassens konstruktor
21
Fler mediakategorier i DoME
• Konstruktorer ärvs inte!
• Subklassens konstruktorer måste innehålla
ett anrop 'super'.
• Om det inte står explicit, lägger
kompilatorn till anropet (utan parametrar)
metoderna visas ej
– fungerar bara om basklassen har en sådan
konstruktor
• Måste vara första satsen i subklassens
konstruktor.
}
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
22
Kap.8
Ytterligare nivåer i hierarkin
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
23
Kap.8
Sammanfattning
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
public class Database
{
private ArrayList items;
/**
* Construct an empty Database.
*/
public Database()
{
items = new ArrayList();
}
Arv ger (så här långt) stöd för :
• Undviker dubletter av kod
• Återanvändning av kod
• Enklare underhåll
• Utökning av befintlig kod
metoderna visas ej
24
Database
ny källkod
avoidsatt
code
Undviker
kod
dupliceras
i klienten
duplication
in
client!
/**
* Add an item to the database.
*/
public void addItem(Item theItem)
{
items.add(theItem);
}
...
}
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
25
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
26
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
27
Database – källkod
Subtypning
Vi hade:
/**
* Print a list of all currently stored CDs and
* videos to the text terminal.
*/
public void list()
{
for(Iterator iter = items.iterator(); iter.hasNext(); )
{
Item item = (Item)iter.next();
item.print();
System.out.println();
// empty line between items
}
}
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
• Klasser definierar typer.
• Subklasser definierar subtyper.
public void addCD(CD theCD)
public void addVideo(Video theVideo)
– CD “är-en” Item
Nu har vi:
• Subklassens objekt kan användas där
det krävs ett objekt av superklassen.
(Detta kallas substitution .)
public void addItem(Item theItem)
Metoden anropas med:
Video myVideo = new Video(...);
database.addItem(myVideo);
28
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Subtyping och tilldelning
29
Kap.8
Parameteröverföring
subclass
objects
Subklassens
objekt
kanbetilldelas
en to
may
assigned
referensvariabel för
superclass
superklassen
variables
public class Database
{
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
30
Objektdiagram
Vilket Item som
helst är ok
public void addItem(Item theItem)
{
Subklassens objekt
...
kan skickas till en
}
}
Vehicle v1 = new Vehicle();
Vehicle v2 = new Car();
Vehicle v3 = new Bicycle();
Subklasser och subtypning
Video video = new Video(...);
CD cd = new CD(...);
Car är-en Vehicle
formell parameter
av superklassens
typ
Video är-en Item
database.addItem(video);
database.addItem(cd);
CD är-en Item
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
31
Kap.8
Klassdiagram
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
32
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
33
Klassen Object
Polymorfi
Alla klasser ärver
från klassen
Object
• Referensvariabler i Java är
polymorfa.
(De kan referera till objekt av mer än en typ.)
• De kan referera till objekt av den
deklarerade klassen eller till objekt
av härledda klasser.
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
34
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
35
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
36
Polymorfa collections
Casting (igen)
Wrapperklasser
• Kan tilldela subtyp till supertyp.
• Kan inte tilldela supertyp till subtyp!
• Alla collections är polymorfa.
• Elementen är av typen Object.
• Alla objekt kan läggas in i
collections...
• ...eftersom collections accepterar
objekt av typen Object...
• …ocj alla klasser är härledda från
Object.
• Bra! Hur är det med primitiva typer?
String s1 = myList.get(1); error!
public void add(Object element)
• Casting fixar detta:
String s1 = (String) myList.get(1);
public Object get(int index)
(bara om elementet är av typen String!)
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
37
Kap.8
Wrapperklasser
Kap.8
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
• Arv möjliggör att man kan utnyttja ett
strukturellt släkskap mellan klasser
• Arv
int i = 18;
Integer iwrap = new Integer(i);
myCollecton.add(iwrap);
...
39
Sammanfattning
wrap
the intav
value
Slå
in värdet
typen int
wrapperklass
Integer
Float
Character
...
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
38
Wrapperklasser
• Primitiva typer (int, char, etc) är inte
objekt. De slås in i paket till ett objekt!
• Wrapperklasser existerar för alla primitiva
typer:
primitiv typ
int
float
char
...
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
–
–
–
–
Lägg
det
addinthe
wrapper
objektifierade värdet
Integer element = (Integer) myCollection.get(0);
int value = element.intValue()
Undviker kodupprepning
Kod kan återanvändas
Förenklar koden
Förenklar underhåll och utvidning
• Referensvariabler kan referera till objekt av
alla underliggande klasser i en hierarki.
retrieve
theett
wrapper
Få tillbaka
objektifierat värde
Taunwrap
av omslaget
40
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
41
Kap.8
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
42