TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Relevanta dokument
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 1

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TDA550 - Objektorienterad programvaruutveckling, fk

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

OOP Objekt-orienterad programmering

Classes och Interfaces, Objects och References, Initialization

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Föreläsning 3: Booleans, if, switch

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

TENTAMEN OOP

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Föreläsning 8: Exempel och problemlösning

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Föreläsning 2, vecka 6: Tillstånd i objektorienterade program (och mera interface)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Repetition av OOP- och Javabegrepp

Malmö högskola 2008/2009 CTS

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Repetition av OOP- och Javabegrepp

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

TENTAMEN OOP

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

TENTAMEN OOP

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Objekt-orientering. Java är ett objekt-orienterat programmeringsspråk

Föreläsning 5-6 Innehåll

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Institutionen för TENTAMEN CTH HT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Tentamen i Objektorienterad programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

DAT043 Objektorienterad Programmering

Del A (obligatorisk för alla)

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen. Grundläggande programmering i Java A 5p, DTAA

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Repetition av viktiga begrepp inom objektorienterad programmering

Värde och typ? Problem. Vad skrivs ut? Referenssematik (1) Joachim von Hacht. Förklara (i detalj)! int x; int y; x = y = 1; out.println(x + ":" + y);

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Objektorienterad Programmering (TDDC77)

1 Repetition av viktiga begrepp inom objektorienterad programmering

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Lösningsförslag tentamen FYTA11 Java

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tentamen. Lösningsförslag

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

DAT043 - Föreläsning 7

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Malmö högskola 2007/2008 Teknik och samhälle

F4. programmeringsteknik och Matlab

Laboration A Objektsamlingar

Föreläsning 3-4 Innehåll

Tentamen, EDAA20/EDA501 Programmering

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2, vecka 8: Repetition

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Arv. Objektorienterad och komponentbaserad programmering

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Föreläsning 6: Metoder och fält (arrays)

Föreläsning 11: Rekursion

OOP Tenta

Tentamen i Objektorienterad programmering E

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Transkript:

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2 Pelle Evensen, Daniel Wetterbro 20 oktober 2011 Sammanfattning Denna vecka ska vi titta på skillnader mellan primitiva typer och referenstyper, typomvandling mellan primitiva typer samt referenser kontra kopior av referenser samt aliasing. Vi ska som hastigast också identifiera problem i samt bygga om lite bedrövligt dålig programkod. Övningarna är graderade (något subjektivt) från lätt ( ) till svår ( ). Svårighetsgraden hos en övning behöver inte ha någonting med lösningens storlek att göra. 1 Referenser 1.1 Anropssemantik & alias Vad borde utdata bli när man kör main i klassen Vektor 1 på sidan 2? Skilj på primitiva typer, referenstyper och alias. Tänk på alias och om ni har call-by-value semantik eller (nästan) call-by-reference 2. I Java sker anrop med call-by-value för primitiva typer. För referenstyper är det alltid call-by-sharing, d.v.s. värdet som skickas är en kopia av referensen till ett objekt. Med lån från övningar av Joachim von Hacht. 1 Mer eller mindre tagen från tenta för Objektorienterad Programmering IT LP 1 2009 2 Java har egentligen inte call-by-reference-semantik alls; Det som förekommer är call by sharing. Se gärna http://en.wikipedia.org/wiki/call_by_value#call_by_sharing. Call by sharing kan man också kalla call by value of reference. 1

public class Vektor { private int x; private int y; private int z; public Vektor(int x, int y, int z) { this.x = x; this.y = y; this.z = z; public double norm() { return Math.sqrt(x * x + y * y + z * z); public void add(vektor v) { x += v.x; y += v.y; z += v.z; public void dumt(int x, int y, int z) { this.x = ++x; this.y = y + 1; this.z += z; public int getx() { return x; public int gety() { return y; public int getz() { return z; public String tostring() { return "Vektor, <x = " + x + ", y = " + y + ", z = " + z + ">"; Vektor a = new Vektor(1, 0, 0); Vektor b = new Vektor(0, 1, 0); Vektor c = a; int x = 1; int y = 2; int z = 3; a.add(b); b.add(b); c.add(c); c.dumt(x, y, z); System.out.println("a: " + a); System.out.println("b: " + b); System.out.println("c: " + c); System.out.println("x: " + x + "\ty: " + y + "\tz: " + z); Figur 1: Klassen Vektor. 2

1.2 Samma kontra lika Avgör för klassen Referenser1 vad utskriften blir. Kör sedan programmet och se om svaret blev vad du trodde det skulle bli. Förklara varför det blev eller inte blev vad du trodde. För att få en tydlig(?) bild av vad svaren borde bli kan man slå i [GJSB05] 3. Specifikationen är bitvis ganska svårläst men den enda källa man i slutändan egentligen kan lita på. public class Referenser1 { stringrefs(); integerrefs(); private static void print(string exp, boolean b) { System.out.println(exp + " -> " + b); private static void printideq(object a, Object b, String aname, String bname) { System.out.println(aName + " == " + bname + " -> " + (a == b) + "\t" + aname + ".equals(" + bname + ") -> " + a.equals(b)); private static void integerrefs() { Integer i = new Integer(2); Integer j = new Integer(2); print("i >= j", i >= j); print("i == j", i == j); // Hmmm... print("i == 2", i == 2); private static void stringrefs() { String s3 = new String("False"); String s4 = new String("False"); printideq(s3, s4, "s3", "s4"); String s5 = "True"; String s6 = "Tr" + "ue"; printideq(s5, s6, "s5", "s6"); String s7 = "False"; String sx = "F"; String s8 = sx + "alse"; printideq(s7, s8, "s7", "s8"); Figur 2: Klassen Referenser1. 3 Finns gratis här: http://java.sun.com/docs/books/jls/ 3

1.3 Referens eller kopia? Betrakta klasserna SimpleSwapper, ValueHolder, ValueHolderSwapper2 och ValueHolderSwapper. Avgör vad utskriften blir då main körs i klassen Refval- Main. class SimpleSwapper { public void swap(integer x, Integer y) { Integer temp = x; x = y; y = temp; public class ValueHolder { public Integer i; public ValueHolder(Integer i) { this.i = i; Figur 3: SimpleSwapper & ValueHolder. class ValueHolderSwapper { public void swap(valueholder v1, ValueHolder v2) { Integer tmp = v1.i; v1.i = v2.i; v2.i = tmp; class ValueHolderSwapper2 { public void swap(valueholder v1, ValueHolder v2) { v1 = new ValueHolder(v2.i); v2 = new ValueHolder(v1.i); Figur 4: ValueHolderSwapper & ValueHolderSwapper2. public class RefvalMain { SimpleSwapper ss = new SimpleSwapper(); ValueHolderSwapper vhs = new ValueHolderSwapper(); ValueHolderSwapper2 vhs2 = new ValueHolderSwapper2(); int a = 1; int b = 2; ss.swap(a, b); System.out.println("a= " + a + " b= " + b); Integer c = new Integer(1); Integer d = new Integer(2); ss.swap(c, d); System.out.println("c= " + c + " d= " + d); ValueHolder v1 = new ValueHolder(a); ValueHolder v2 = new ValueHolder(b); vhs.swap(v1, v2); System.out.println("a= " + v1.i + " b= " + v2.i); vhs2.swap(v1, v2); System.out.println("a= " + v1.i + " b= " + v2.i); Figur 5: RefvalMain. 4

2 Implicit typomvandling Vid körning av main i klassen Casting1 4 skulle man kunna tro att utskriften blir 30587000000000 I själva verket blir det något helt annat 5. Exakt vad är inte så intressant men genom att härleda vilken typ varje deluttryck har kan man förstå varför. Antag att a, b, c är av samma typ, att a + b är av typen int och att a + b + c är samma sak som (a + b) + c vilket bör få samma typ som a + b... Vilken precision har (de primitiva) typerna 6 i Java? Vilka intervall kan de representera? public class Casting1 { final long PARSEC = 30587 * 1000000000 * 1000; final long M PER KM = 1000; System.out.println(PARSEC / M PER KM); Figur 6: Klassen Casting1. 3 Snygg design? Jan 7 har byggt ett fint spel där man ska döda varelser. Som tur var insåg han tidigt i utvecklingen av spelet att strukturen nedan skulle vara mindre lyckad då man kan tänkas vilja lägga till fler varelser och beteenden. Diskutera vilka nackdelar som finns med strukturen i klasserna Gang (fig. 7) och Creature (fig. 8). Skriv om koden så att man blir av med de problem ni identifierat. Kan abstrakta klasser eller interface vara till någon hjälp? I så fall, vilket borde man välja? Vill eller kan man kombinera dem? Har polymorfism något med saken att göra? Referenser [BG05] Joshua Bloch and Neal Gafter. Java puzzlers: traps, pitfalls, and corner cases. Addison-Wesley, Boston, Mass., 2005. [GJSB05] James Gosling, Bill Joy, Guy Steele, and Gilad Bracha. The Java Language Specification, Third Edition. The Java Series. Addison-Wesley, Boston, Mass., 2005. 4 Lånat från [BG05] och något modifierat. 5 440487 6 Se 4.2.1 i http://java.sun.com/docs/books/jls/third_edition/html/typesvalues.html 7 Problemet lånat från tenta av Jan Skansholm. 5

public class Gang { private List<Creature> members; public Gang(int size) { members = new ArrayList<Creature>(size); public void add(creature m) { members.add(m); public boolean remove(creature m) { return members.remove(m); public int damagesum() { int total = 0; for (Creature c : members) { if (c!= null) { int energy = c.getenergy(); switch (c.gettype()) { case SNAKE: total += 10 * energy; break; case GOBLIN: total += 4 * energy * energy; break; case SPIDER: if (energy > 5) total += 100; break; return total; Gang gang = new Gang(3); gang.add(new Creature("Sour Serpent", Creature.Type.SNAKE)); gang.add(new Creature("Greasy Goblin", Creature.Type.GOBLIN)); gang.add(new Creature("Spicy Spider", Creature.Type.SPIDER)); System.out.println("Collective damage: " + gang.damagesum()); Figur 7: Klassen Gang. public class Creature { public enum Type { SNAKE, GOBLIN, SPIDER ; private Type type; private int energy = 100; private String name; public Creature(String n, Type t) { this.name = n; this.type = t; public Type gettype() { return type; public int getenergy() { return energy; public void setenergy(int e) { this.energy = e; public String getname() { return name; Figur 8: Klassen Creature. 6