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