"# %% & ' ()*,"""). / " %% &%% / ( 0/ " 1 /(232.,..5. 6 7,.5.,. / : ; 5.. )// ).) 8 < ') < 6 6 8 < 8 8 7,.5.,.9 5. 5. 5. 5. 5.. 5..9
/.> DB(?/ ( / (.?/. /?(5@"""6(?( 5@""6 &. A8 6 (."B 3 8 6 ) ("?/& = C D ') A ' F ) G.)" 8 &(& ( ) H.)2 > </ A 5)(A 5&@6 &)).). I 0 ) )(') 6. /.A0./>)/ /"""J/ A?.""" ))A 5&A JAK.. @6AJ).?AJ&""" </ ' 0.( E..
J)(.( Dokumet UtlåbartDokumet Dokumet #.. IkkeLåbartDokumet Bok CD Video Tidskrift Bok CDU VideoU UtlåbarBok IkkeLåbarBok UtlåbarCD IkkeLåbarCD FlerbidsverkU AtikvariskBok AtikvariskUtlåbCD UtlåbartTid sskriftr IkkeLåbartTi dsskriftr Atikvarisk tidsskriftr FlerbidsverkU AtikvariskUtlåbCD TidsskriftrU Bok CD Video AtikvariskBok Tidsskriftr L ))&A Dokumet 8 > iterface TilUtlå UtlåbarBok Verk Bok CD Video AtekvUtlåbrCD AtikvariskBok IkkeLåbarCD Utlåbart Tidsskriftr Utlåbart, Atekvarisk Tidsskrift iterface Atikvarisk Tidskriftr 0 &. 3 6" ). IkkeLåbartTids skriftr Atikvarisk tidsskriftr 0H2 0(.. ( 0 ) / ). )." 0 ) K M/ )
') 8& /. ) ) H2HD &2A Skatt 0) 3( class Bil { Strig regnr; class Persobil exteds Bil { it atpass; class Lastebil exteds Bil { double lastevekt; class Drosje exteds Persobil { it LøyveNr; Bil Persobil iterface Skatt { double toll( ) ; it momssats() ; Skatt Lastebil Drosje "# Miljo #)) D iterface Miljo { it co2utslipp ( ); boolea svaemerket ( ) ; Miljo J' ) 'F3A Skatt Lastebil Bil Persobil Drosje Miljo class DrosjeBil exteds Drosje implemets Skatt, Miljo { double momsgrulag = 150000; it utslipp = 200; public double toll( ) { retur momsgrulag * 0.5; public it momssats( ) {retur 20; public it co2utslipp ( ) {retur utslipp; public boolea svaemerket () { retur false; ( H 2 HD 2 LastebilMedSkattogMiljo DrosjeBil Me metodee må (dessverre) skrives på ytt hver gag de brukes = class LastebilMedSkattogMiljo exteds Lastebil implemets Skatt, Miljo { double ikjopspris = 200000; it utslipp = 00; public double toll( ) { retur ikjopspris * 0.1; H 2 public it momssats( ) {retur 20; public it co2utslipp ( ) {retur utslipp; HD 2 public boolea svaemerket () { retur false; C
0 ) B /.)/ A 5 5 B B BD D & # D & &J 8 ) > % & #? #)) D.)) )) E class Bil { Strig regnr; void skriv(){ System.out.pritl( Registrerigsummer: " regnr); class Persobil exteds Bil { it atpass; void skriv (){ super.skriv(); System.out.pritl("Atall pass.: " atpass); class Lastebil exteds Bil { double lastevekt; void skriv (){ super.skriv(); System.out.pritl("Lastevekt: " lastevekt); class Drosje exteds Persobil { it loyvenr; void skriv (){ super.skriv(); System.out.pritl("Løyve Nr.: " loyvenr); 6 5 BD""""" class DrosjeBil exteds Drosje implemets Skatt, Miljo { double momsgrulag = 150000; it utslipp = 200; public double toll( ) { retur momsgrulag * 0.5; public it momssats( ) {retur 20; public void skrivskatt( ) { System.out.pritl("MomsGrulag" momsgrulag); public it co2utslipp ( ) {retur utslipp; public boolea svaemerket () { retur false; public void skrivmiljo() { System.out.pritl("Utslipp " utslipp); public void skriv( ) { System.out.pritl( DrosjeBil: "); super.skriv( ); skrivskatt( ); skrivmiljo( ); D & L class LastebilMedSkattogMiljo exteds Lastebil implemets Skatt, Miljo { double ikjopspris = 200000; it utslipp = 00; public double toll( ) { retur ikjopspris * 0.1; public it momssats( ) {retur 20; public void skrivskatt( ) { System.out.pritl("Ikjøpspris " ikjopspris); public it co2utslipp ( ) {retur utslipp; public boolea svaemerket () { retur false; public void skrivmiljo( ) { System.out.pritl("Utslipp " utslipp); )., '".")HB &AN.)" D D & 6. D H23
5 5 ( BD D % &' # 6 5 5 5 B B BD D & # D & &J? < < 6 6 5 6 # #)) D #)) D & &J D )., '".") HB &AN.)" D.)) )) D.)). D J Dokumet iterface TilUtlå Bok CD BokTilUtlaa BokIkkeUtlaa CDTilUtlaa CDIkkeUtlaa iterface TilUtlå BokTilUtlaa Bok Dokumet BokIkkeUtlaa Ordet abstract ka sløyfes før metodeavet i et iterface (det er jo helt opplagt) abstract class Dokumet { Strig tittel; abstract class Bok exteds Dokumet { Strig forlag; it trykigsår; iterface TilUtlaa { abstract void låe(strig låer) ; abstract void levere() ; abstract boolea utlåt() ; static fial Strig ige = "ige"; // Slutt iterface TilUtlaa
5J )/ ) A iterface TilUtlaa BokTilUtlaa Bok Dokumet BokIkkeUtlaa 5 5J( / ) 5 ) J" # ) ; class BokTilUtlaa exteds Bok implemets TilUtlaa { Strig låer = ige; public void låe (Strig l) { låer = l; public void levere() { låer = ige; public boolea utlåt() { retur låer = ige; // Slutt class BokTilUtlaa class BokIkkeUtlaa exteds Bok { = iterface TilUtlaa { abstract void låe(strig låer) ; abstract void levere() ; abstract boolea utlåt() ; STATIC fial Strig ige = ige"; class BokTilUtlaa exteds Bok implemets TilUtlaa { Strig låer = ige; public void låe (Strig l) { låer = l; public void levere() { låer = ige; public boolea utlåt() { retur låer = ige; Metodee i et iterface er veldig virtuelle Dette er de tre metodee som vi må love å implemetere C iterface TilUtlaa { abstract void låe(strig låer) ; abstract void levere() ; abstract boolea utlåt() ; static fial Strig ige = ige"; @67 6., ). @6J 7@6) J, /M )./,/M ).,/M )../,. /;M *.@6J iterface TilUtlå CDTilUtlaa Dokumet CD CDIkkeUtlaa Her er de tre metodee igje D )/. /)/)/ E?/ )( & 6O) )"?A0) / O. " 0)..)(&/ " @6 7@6, E
6. ( )*, './/0 1# 2, 3 & )#.//0 3 1* 2 51 ), A Først atall poster på file For hver post: dokumettype (BU, BI, CU eller CI) tittel Hvis Bok: forlag år Hvis BokTilUtlå: Også låer Hvis CD: kompoist / artist / musikkforlag Hvis CDTilUtlå: Også låer L ifil 5 6* 6.P 3 atdok 6. void lesfrafil() Dokumet d = ull; Strig dokumettype; I ifil = ew I( dokumetfil.txt ); atdok = ifil.iit( ); for (it i=1; i<=atdok; i) { dokumettype = ifil.iword( ); if (dokumettype.equals("bu")) d = ew BokTilUtlaa(); else if (dokumettype.equals("bi")) d = ew BokIkkeUtlaa(); else if (dokumettype.equals("cu")) d = ew CDTilUtlaa(); else if (dokumettype.equals("ci")) d = ew CDIkkeUtlaa(); d.lesfra(ifil); alledokumeter.put(d.tittel,d); // Slutt for 5 ) 7# )7# 5 15 7# 157# 5 6# 6.P 3 D / 6.P void låe() utfil void skrivtilfil() Dokumet d = ull; Strig dokumettype; Out utfil = ew Out( dokumetfil.txt ); Iterator e = alledokumeter.values().iterator(); while (e.hasnext()) { d = (Dokumet) e.ext(); d.skrivtilfil(fil); // slutt while 6. e 5 ) 7# )7# 5 15 7# 157# void låe() throws IOExceptio { boolea utlåt() Object d = ull; Strig h; void levere() System.out.prit( Tittel: "); h = i.readstrig( ); d = alledokumeter.get(h); if (d==ull) System.out.pritl("Beklager, dee har vi ikke"); else if (d istaceof TilUtlaa) { TilUtlaa t = (TilUtlaa) d; if (t.utlåt()) System.out.pritl("Beklager, utlåt"); else { System.out.prit( Låers av: "); Strig = i.readstrig( ); t.låe(); // Slutt if (d istaceof TilUtlaa) else System.out.pritl("Beklager, dee låer vi ikke ut"); // Slutt låe
Klasse og iterfacetilhørighet (igje) leveretilbake i DokumetRegister Test med operatore istaceof if (d istaceof TilUtlaa) p istaceof C Gir TRUE dersom p peker på et objekt av klasse C eller e subklasse av C, eller dersom p peker på e klasse som implemeterer iterfacet C Edrig med castig d Object d = alledokumeter.get(h); TilUtlaa t = (TilUtlaa) d; OK, dersom d er et objekt av e av klassee BokTilUtlaa eller CDTilUtlaa (dvs. spiller rolle TilUtlaa). void Låe() i DokumetRegister ka dermed brukes med hell for alle klasser som implemeterer iterface TilUtlå (k.eks. låe klær, låe biler ) 5 ) 7# )7# t ser bare TilUtlåegeskapee J, 6.M. ( '".")2JAN (M" M6.6."( MM. '".")N5N J, J MJ "./, " '".")NJN '".")N5./N *. J void låe() boolea utlåt() void levere() * 0. F( 1F (" #. ; QB Q.) P, 8(D) """ <, """, """").( """ *. < class Object { // Alle objekters mor boolea equals(object obj)... Object cloe()... public fial class Strig exteds Object { public fial class Math exteds Object { public class Date exteds Object { public abstract class Caledar exteds Object { public iterface Map {... public iterface Collectio {... public iterface Iterator {... Alle klasser er subklasser av class Object. Hvis klassedeklarasjoe ikke har med exteds, tolker kompilatore det som exteds Object R.( """ *. P public abstract class AbstractMap exteds Object implemets Map {... Du må altså opprette et objekt av de ytre klasse før du får lov til å lage objekter av de idre klasse = public class HashMap exteds AbstractMap implemets Map, Cloeable, Serializable { Object get(object key) { void put (Object key, Object value) {... C
8(D) class HashMap exteds AbstractMap implemets Map, Cloeable, Serializable { // Hemmelig datastruktur public void put(object key, Object value) {... public Object remove(object key) {... public Object get(object key) {... public boolea cotaiskey(object key) {... public boolea cotaisvalue(object value) {... public it size( ) {... public Collectio values( ) {... // slutt class HashMap Java har etter hvert mage klasser som ka brukes til å ta vare på objekter: Vector, ArrayList, Collectio, HashMap HashSet, LikedList, Stack, TreeSet, TreeMap,...) E ).@, ).S ). """ )., ).(7 ).# 7 8(D)""", 89 : ),""" )@, ).,.M: """.. ).).""",""" """ ).@.,.M: """.. """ 8(D) @ HashMap har altså sie ege implemetasjoer av Collectio og Iterator som er hemmelig for oss utefor, me side alle metodee er kjet ka vi kalle på disse (på este side) ) alledokumeter void visalledokumeter() Dokumet d; Iterator e = alledokumeter.values().iterator(); while (e.hasnext()) { d = (Dokumet) e.ext(); d.vispaaskjerm(); // slutt while Collectio Ukjet2 Iterator Ukjet1 Iterator iterator () boolea hasnext() Object ext() d e mitabell mitabell Collectio values() L 0( 3 JBBM ) 5.%% %% & %')% / ) 5@) 5.',""""(%5.'%""" D'.'.' )F )A1*) / & 57M6J')?'') & &" 6O.) M// ')" 8) / & (.("