Föreläsning 7. Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Metoden equals()
|
|
- Jan-Olof Lucas Arvidsson
- för 8 år sedan
- Visningar:
Transkript
1 Föreläsning 7 Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Metoden equals() Muterbara kontra icke-muterbara klasser Objekt som tillhör en icke-muterbar klass kan inte ändra sitt tillstånd, d.v.s. det tillstånd som objektet får när det skapas bibehålls under objektets hela livstid. Ett icke-muterbart objekt har således ett garanterat beteende, dess värde kan avläsas hur många gånger som helst och samma resultat erhålls varje gång.
2 Muterbara kontra icke-muterbara klasser Är klassen GeoTag icke-muterbar? import java.util.date; public class GeoTag { private int latitude; private int longitude; private Date timestamp; public GeoTag(int latitude, int longitude, Date timestamp) { this.latitude = latitude; public int getlongitude() { this.longitude = longitude; return longitude; this.timestamp = timestamp; //getlongitude //constructor public Date gettimestamp() { public int getlatitude() { return timestamp; return latitude; //gettimestamp //getlatitude //GeoTag Anm: java.util.date är en muterbar klass. Muterbara kontra icke-muterbara klasser Klassen har inga mutator-metoder, men den är likväl muterbar! Avläsningsmetoderna verkar harmlösa, men de utgör en dold fara. Betrakta kodsekvensen nedan: GeoTag tag = ; Date date = tag.gettimestamp(); date.settime(t); Vad som inträffar illustreras av följande bild :GeoTag latitude longitude timestamp date tag :Date Den interna representationen i objektet är exponerad!
3 Muterbara kontra icke-muterbara klasser I och med att satsen date.settime(t) exekveras ändras tillståndet av objektet tag. Detta är troligen inte vad utvecklaren av klassen GeoTag tänkt sig! Botemedlet är att skapa en kopia av objektet innan det ges ut: public Date gettimestamp() { return timestamp; return (Date) timestamp.clone(); Kloning är mer klurigt än vad man vid en första anblick kan tro. Vi återkommer till detta senare. Muterbara kontra icke-muterbara klasser Är klassen icke-muterbar nu, när en klonad kopia av timestamp-objektet fås vid avläsning? Nej! Betrakta nedanstående kod: Date date = new Date(); GeoTag e = new GeoTag(12, 14, date); date.settime(...); En ondskefull programmerare skapar ett Date-objekt, behåller själv en referens till objekt och skickar denna referens till konstruktorn för klassen GeoTag. Således kommer denna referens att bli delad. Lösningen är att låta konstruktorn klona referensen till Date-objektet: public GeoTag(int latitude, int longitude, Date timestamp) { this.latitude = latitude; this.longitude = longitude; this.timestamp = timestamp; this.hiredate = (Date) timestamp.clone(); //constructor
4 Icke-muterbara klasser och trådsäkerhet Egenheter i Java's minneshantering innebär att nedanstående implementation inte är trådsäker, dvs vid användning i flertrådade program. import java.util.date; public class GeoTag { private int latitude; private int longitude; private Date timestamp; public GeoTag(int latitude, int longitude, Date timestamp) { this.latitude = latitude; this.longitude = longitude; this.timestamp = (Date) timestamp.clone(); //constructor public int getlatitude() { public int getlongitude() { return latitude; return longitude; //getlatitude //getlongitude public Date gettimestamp() { return (Date) timestamp.clone(); //gettimestamp //GeoTag Inte trådsäker Icke-muterbara klasser och trådsäkerhet För att en icke-muterbar klass skall bli trådsäker måste alla instansvariabler (och klassvariabler) göras final. import java.util.date; public class GeoTag { final private int latitude; final private int longitude; final private Date timestamp; public GeoTag(int latitude, int longitude, Date timestamp) { this.latitude = latitude; this.longitude = longitude; this.timestamp = (Date) timestamp.clone(); //constructor public public int getlatitude() { int getlongitude() { return return latitude; longitude; //getlongitude //getlatitude public Date gettimestamp() { return (Date) timestamp.clone(); //gettimestamp //GeoTag Trådsäker Trådar och trådsäkerhet kommer att behandlas mer utförligt senare under kursen.
5 Icke-muterbara klasser och arv Det finns inget som förhindrar att en icke-muterbar klass ärvs går tekniskt strider inte i sig mot Liskovs Substitution Principle Man skall dock noga överväga om en icke-muterbar klass skall gå att ärva: om arv tillåts finns inga garantier för att subklasserna är icke-muterbara vid dynamisk bindning kan man därför inte utgå ifrån att ett objekt verkligen är icke-muterbart då objektets superklass är icke-muterbar leder till att de fördelar som finns med icke-muterbarhet går förlorat Icke-muterbara klasser och arv För att förhindra att en klass kan ärvas deklareras klassen som final. Icke-muterbar klass import java.util.date; final public class GeoTag { som inte kan final private int latitude; ärvas final private int longitude; final private Date timestamp; public GeoTag(int latitude, int longitude, Date timestamp) { this.latitude = latitude; this.longitude = longitude; this.timestamp = new Date(timestamp.getTime()); //constructor final final public int getlatitude() { public int getlongitude() { return return latitude; longitude; //getlongitude //getlatitude final public Date gettimestamp() { return new Date(timestamp.getTime()); //gettimestamp //GeoTag
6 Användning av final Man kan markera instansvariabler och klassvariabler som final för att förhindra att variabeln förändrar sitt värde efter det att den har skapats. Dock betecknar final-modifieraren endast att innehållet i variabeln är ett konstant värde. Tillståndet hos objektet som variabeln refererar till kan förändras!! Man kan markera en parameter som final. Detta betyder att metoden inte får förändra parameterns värde. Man kan markera en metod med final. Detta betyder att metoden inte kan överskuggas i en subklass. Man kan deklarera en klass med final. Detta betyder att klassen inte kan användas som superklass. Icke-muterbara klasser Vilka klasser skall vara icke-muterbara? Det generella svaret är så många som möjligt. Särskilt gäller detta klasser på den lägsta nivån, dvs klasser som representerar data. Dessa objekt är värdeobjekt och skall vara ickemuterbara. Klassen String och omslagsklasserna för de primitiva typerna, t.ex Integer, Double och Boolean är exempel på sådana icke-muterbara klasser. Classes should be immutable unless there s a very good reason to make them mutable. If a class connot be made immutable, limit its mutability as much as possible. (Joshua Bloch).
7 Icke-muterbara klasser import java.awt.point; public final class ImmutableCircle { final private Point center; final private int radius; public ImmutableCircle(Point center, int radius) { this.center = new Point(center); this.radius = radius; public ImmutableCircle setradius(int radius) { public int getradius() { return new ImmutableCircle(this.center, radius); return this.radius ; public ImmutableCircle moveto(point p) { return new ImmutableCircle(p, this.radius); public ImmutableCircle moveby(int dx, int dy) { return moveto(new Point(center.x + dx, center.y + dy)); public Point getlocation() { return new Point(center); //ImmutableCircle Icke-muterbara klasser När man väl bestämt sig för att göra en klass A icke-muterbar, hur skall man gå tillväga för att förvissa sig om att den verkligen blir icke-muterbar? Här är de tre viktigaste sakerna som skall göras: Gör alla instansvariabler i A final private. Uteslut alla mutator-metoder. Konstruktorn skall skapa klonade kopior av muterbara argument. Accessor-metoder skall returnera klonade kopior av muterbara attributet. Förhindra att subklasser till A överskuggar metoder genom att göra alla metoderna final, eller förhindra arv genom att göra klassen A final. En nackdel med icke-muterbara objekt är att om man skulle vilja ändra dess tillstånd (värde) måste man skapa ett helt nytt objekt, vilket kan vara kostnadskrävande. Java har därför t.ex. infört klassen StringBuffer för att hantera muterbara strängar.
8 Delegering Antag att du behöver en klass som är identisk med en muterbar klass, förutom att klassen måste vara icke-muterbar. Som exempel kan vi säga att vi behöver en klass FixedPoint som är en icke-muterbar version av klassen java.awt.point. Två förslag på att åstadkomma detta är: 1. Strunta i klassen Point och skriv klassen FixedPoint från grunden. 2. Låt FixedPoint vara en subklass till Point, och överskugga metoderna move, translate och setlocation på så sätt att de inte gör någonting alls. java.awt.point +x: int +y: int +move(int, int): void +translate(int, int): void +setlocation(int, int): void +setlocation(double, double): void +setlocation(point): void FixedPoint +move(int, int): void +translate(int, int): void +setlocation(int, int): void +setlocation(double, double): void +setlocation(point): void Varför är dessa förslag dåliga? Delegering En tredje och betydligt bättre metod är att använda delegering. FixedPoint -pt: Point +getx(): double +gety(): double +getlocation(): Point +equals(object): boolean +tostring(): String java.awt.point +x: int +y: int Detta innebär att vi gör en wrapper -klass: klassen tillhandahåller ett gränssnitt som endast innefattar read-only metoder klassen har ett objekt av klassen Point i vilken klassen sparar sin data.
9 Delegering Ett första, men felaktigt, implementering: public class FixedPoint { private Point pt; public FixedPoint(Point p) this.pt = p; //constructor public FixedPoint(int x, int y) { this.pt = new Point(x,y); //constructor public double getx() { return pt.getx(); //getx public double gety() { return pt.gety(); //gety public Point getlocation() { return pt; //getlocation //FixedPoint Vid en första anblick ser denna klass ut att vara icke-muterbar. Men är den det? Delegering Vi har exakt samma problem som i vårt tidigare exempel med klassen Employee. Vad sker när nedanstående kod exekveras? FixedPoint fp = new FixedPoint(3,4); Point loc = fp.getlocation(); loc.x = 5; Point p = new Point(3,4); FixedPoint fp = new FixedPoint(p); p.x = 5;
10 Delegering En korrekt implementation av FixedPoint har följande utseende: public final class FixedPoint { private final Point pt; public FixedPoint(Point p) this.pt = new Point(p); //constructor public FixedPoint(int x, int y) { this.pt = new Point(x,y); //constructor public double getx() { return pt.getx(); //getx public double gety() { return pt.gety(); //gety public Point getlocation() { return new Point(pt); //getlocation //FixedPoint Att designa en klass Hur en klass skall utformas och implementeras måste avgöras från två olika infallsvinklar utvecklarens perspektiv och användarens perspektiv. Programmerare utvecklar klasser för att de skall användas av andra programmerare. Den som utvecklar klassen har sina speciella målsättningar med klassen, såsom effektiva algoritmer och lätthanterlig kod. De som använder klassen vill kunna förstå och använda klassen utan att bry sig om den interna representationen. De vill ha en uppsättning metoder som är tillräckliga för att kunna lösa sin programmeringsuppgift, men som samtidigt är så begränsad att det är enkelt att förstå hur klassen och metoderna i klassen skall användas på bästa sätt. I mindre programmeringsprojekt, som labbarna på denna kurs, är det samma programmerare som både utvecklar en klass och sedan använder klassen. Rollerna som säljare och kund upplevs som diffus. Men försök att särskilja dessa båda perspektiv.
11 The Newspaper Metaphor En klass skall vara utformad som en välskriven tidningsartikel. Artikeln läses uppifrån och ned. Högst upp finns en rubrik som talar om vad artikeln handlar om. Ingressen ger en översikt och kontext om historien som beskrivs, utan att ta upp detaljerna. Fortsätter man läsa får man slutligen hela historien med alla detaljer. En tidning består av många artiklar, var av de flesta är mycket korta. Somliga är längre, men mycket få är så långa att de upptar mer än en sida. Detta gör en tidning användarvänlig. Skulle en tidning vara en enda långt oorganiserad gytter av text skulle ingen läsa tidningen. Det samma gäller källkoden för ett program! Vad skall en klass tillhandahålla? Vi skall här diskutera ett antal bedömningsgrunder för att avgöra hur bra gränssnittet för en klass är avseende: - sammanhållning (cohesion) - bekvämlighet (convenience) - tydlighet (clarity) - konsistens (consistency) - fullständighet (completeness)
12 Sammanhållning (cohesion) En klass skall ha ett väl avgränsat ansvarsområde, d.v.s. vara en abstraktion av ett avskilt koncept eller fenomen. Alla operationer i klassen skall passa logiskt ihop för att stödja ett särskilt syfte. Denna princip kallas The Single Responsibility Principle, en annan beteckning för samma sak är Separation of concern. A class has a single responsibility. It represents one thing. It does one thing only and does it well. (Tom DeMarco) Sammanhållning (cohesion) Betrakta klassen Mailbox: Metoden processcommand skiljer sig från alla andra metoder i klassen Mailbox. Mailbox +addmessage(message) +getmessage(): Message +removemessage() +processcommand(string) De övriga metoderna utför operationer på en och samma abstraktion; nämligen en brevlåda som innehåller meddelanden. Metoden processcommand lägger dock ytterligare en egenskap till brevlådan, nämligen att handha kommandon. Det vore mycket bättre att ha en annan klass som handhar kommandon, och låta brevlådan göra vad den är bra på, d.v.s. att lagra meddelanden.
13 The Single Responsibility Principle A class should have only one reason to change. (Robert Martin) Om en klass har flera ansvarsområden kommer de olika ansvarsområdena att bli kopplade till varandra. Varje ansvarsområde kan leda till förändringar i klassen p.g.a. ändrade krav. Förändringar i ett ansvarsområde kan påverka klassens förmåga att hantera de andra ansvarsområdena. En klass som har många ansvar kommer också att ha kopplingar till många andra klasser. Klassen riskerar att behöva modifieras då andra klasser modifieras. En klass med fler än ett ansvarsområde ger bräcklighet. Single Responsibility Principle One of the criteria I use is to try to describe a class in 25 words or less, and not to use "and" or "or". If I can't do this, then I may actually have more than one class. (Brian Button) Klasser som försöker göra många saker, blir inte bara sårbara för förändringar, utan de blir också oöverblickbara och svåra att förstå. Slutsats: Bryt ner stora saker för att minska komplexiteten.
14 Bekvämlighet (convenience( convenience) Ett gränssnitt kan vara komplett i den meningen att det tillhandahåller tillräckligt med operationer för att utföra allt nödvändigt. Men som användare av klassen skall man inte behöva utföra en serie av operationer för att lösa en begreppsmässigt enkel uppgift. Ett bra gränssnitt skall inte bara tillhandahåll operationer för att utföra uppgiften, utan operationer som gör det enkelt att lösa uppgiften. Att läsa indata från System.in är en mycket vanlig uppgift i ett program. Tyvärr har System.in ingen metod för att läsa in en rad. Före Java 5.0 var man tvungen till att innesluta System.in i en InputStreamer och sedan i en BufferedReader, vilket var mycket obekvämt. Problemet löstes med att slutligen införa klassen Scanner. Men varför tog det så lång tid? Tydlighet (clarity) Gränssnittet till en klass skall vara tydligt och begripligt. Förvirrade programmerare skriver dålig och felaktig kod.
15 Tydlighet (clarity) Låt oss titta på ett exempel från Javas standardbibliotek. LinkedList<String> list = new LinkedList<String>(); list.add("a"); list.add("b"); list.add("c"); För att genomlöpa listan använder vi en iterator: ListIterator<String> iterator = list.listiterator(); while (iterator.hasnext()) System.out.println(iterator.next()); Iteratorns position är en position mellan två element i listan, precis som - markören i ett ordbehandlingssystem står mellan två tecken. Metoden add i ListIterator lägger ett element före iteratorns position, exakt som i ett ordbehandlingssystem. ListIterator<String> iterator = list.listiterator(); // ABC iterator.next(); // A BC iterator.add("x"); // AX BC Tydlighet: fortsättning på exemplet Men metoden remove i ListIterator är allt annat än intuitiv. I ett ordbehandlingssystem tar remove bort elementet till vänster om markören. Således skulle man förvänta sig följande: ListIterator<String> iterator = list.listiterator(); // ABC iterator.next(); // A BC iterator.add("x"); // AX BC iterator.remove(); // A BC iterator.remove(); // BC Dock är båda anropen av remove() ogiltiga! I dokumentationen av remove står: Removes from the list the last element that was returned by next or previous. This call can only be made once per call to next or previous. It can be made only if add has not been called after the last call to next or previous.
16 Konsistens (consistency( consistency) Operationerna i en klass skall vara konsistenta med varandra avseende namn, parametrar, returvärde samt beteende. I Javas standardbibliotek finns exempel på inkonsistenser. För att ett objekt (som representerar ett datum) i klassen GregorianCalendar anger man new GregorianCalendar(year, month 1, day) Alltså förväntar sig konstruktorn att månad anges som ett heltal mellan 0 och 11, däremot skall dag anges som ett heltal mellan 1 och 31! Mycket logiskt! Ett annat exempel är metoden substring i klassen String: substring(start, end) returnerar delsträngen med startposition start och slutposition end-1. Fullständighet (completeness( completeness) Gränssnittet till en klass skall vara komplett. Det skall stödja alla operationer som på ett naturligt sätt är associerade med den abstraktion som klassen representerar. Låt oss titta på klassen java.util.date. Antag vi har kodsegmentet Date start = new Date(); // Do some work Date stop = new Date(); Vi vill nu ta reda på hur många millisekunder det har förflutit mellan tidpunkten då start skapades och tidpunkten då stop skapades. Klassen Date har metoderna before och after som kan användas för att ta reda på om start skapats före eller efter stop. Men det finns ingen metod för att beräkna skillnaden mellan start och stop. Det är ingen allvarlig brist, då vi kan beräkna tiden vi söker genom att använda metoden gettime() long difference = stop.gettime() -start.gettime(); men det hade känts naturligare att kunna skriva long difference = stop.getdifference(start);
17 The Uniform Access Principle Denna princip säger att den service som en klass tillhandahåller skall vara åtkomlig med en enhetlig notation, som inte avslöjar om resultatet åstadkoms genom beräkning eller om det finns lagrat i minne. public class Rectangle { public final int area; public Rectangle(int width, int height) { this.width = width; this.height = height; area = width * height; public int getperimeter() { return 2 * (width + height); //Rectangle Rectangle rek = new Rectangle(5, 12); int thearea = rek.area; int theperimeter = rek.getperimeter(); Bryter mot uniform access Har ni råkat ut för detta i grundkursen? The Uniform Access Principle public class Rectangle { private final int area; public Rectangle(int width, int height) { this.width = width; this.height = height; area = width * height; Rectangle rek = new Rectangle(5, 12); public int getarea() { int thearea = rek.getarea(); return area; int theperimeter = rek.getperimeter(); public int getperimeter() { return 2 * (width + height); //Rectangle
18 Expert pattern Denna princip säger att det objekt som har den information som behövs för att utföra en uppgift skall utföra uppgiften. public class Phone { private final String unformattednumber; public Phone(String unformattednumber) { this.unformattednumber = unformattednumber; public String getareacode() { public class Customer { return unformattednumber.substring(0,3); private Phone mobilephone; public String getmobilephonenumber() { public String getprefix() { return "(" + mobilephone.getareacode() return unformattednumber.substring(3,6); + ") " + mobilephone.getprefix() + "-" + mobilephone.getnumber(); public String getnumber() { return unformattednumber.substring(6,10); Expert pattern public class Phone { private final String unformattednumber; public Phone(String unformattednumber) { this.unformattednumber = unformattednumber; public String getareacode() { return unformattednumber.substring(0,3); public class Customer { private Phone mobilephone; public String getprefix() { public String getmobilephonenumber() { return unformattednumber.substring(3,6); return mobilephone.toformattedstring(); public String getnumber() { return unformattednumber.substring(6,10); public String toformattedstring() { return "(" + getareacode() + ") " + getprefix() + "-" + getnumber();
19 Principen Tell, don't ask Denna princip säger att ett objekt inte skall fråga ett annat objekt om dess tillstånd, fatta något beslut baserat på detta tillstånd och därefter tala om för det andra objektet vad det skall göra. public class Lung { private int oxygenamount; public int getoxygenamount() { return oxygenamount; public void breathesomeair() { // do the necessary action to breathe public class Human { private Lung thelung; public void breathe() { Lung mylung = getlung(); if (mylung.getoxygenamount() < 0) { mylung.breathesomeair(); public Lung getlung() { return thelung; Principen Tell, don't ask public class Lung { private int oxygenamount; public int getoxygenamount() { return oxygenamount; public void breathesomeair() { if (getoxygenamount() < 0) { // do the necessary action to breathe public class Human { private Lung thelung; public void breathe() { Lung mylung = getlung(); mylung.breathesomeair(); public Lung getlung() { return thelung; Responsibility implies non-interference. (Timothy Budd)
20 Law of Demeter: Don't talk to strangers Ju fler klasser som en klass samverkar med, desto bräckligare och svårare att förstå bli klassen. Tanken med Law of Demeter är att en klass skall veta så lite som möjligt om den interna strukturen hos andra klasser. Genom att undvika att anropa metoder på ett objekt som returneras från en annan metod minimerar man mängden beroenden och ser till att objekten inte bryter inkapslingen av data. Law of Demeter säger att en metod m i klassen C endast skall samverka med objekt som: 1. skapats av m 2. är instansvariabler i C 3. är argument till m 4. är objektet själv (this) Law of Demeter: Don't talk to strangers Betrakta nedanstående anrop Balance balance = centralcontrol.getbank(b).getbranch(r). getcustomer(c).getaccount(a).getbalance(); dog.getbody().gettail().wag(); Det första anropet är beroende av 5 objekt och det andra anropet är beroende av 3 objekt. Enligt Law of Demeter skall dessa anrop ersättas med följande anrop: Balance balance = centralcontrol.getbalance(b, r, c, a); dog.wagtail();
21 Law of Demeter: Don't talk to strangers :A :B :C :D :E getc(c) c getd(d) d gete(e) :F e f value() getf(f) getvalue() Talk only to your immediate friends :A :B :C :D :E getvalue(c,d,e,f) getvalue(d,e,f) getvalue(e,f) getvalue(e) value value value value getvalue() value :F Interface Segregation Principle (ISP) Classes should not be forced to depend on methods that they do not use. Design som bryter mot ISP Client A Client B Client C UI Methods for Client A Methods for Client B Methods for Client C Design som följer ISP Client A Client B Client C Interface for Client A-like classes Interface for Client B-like classes Interface for Client C-like classes UI Methods for Client A Methods for Client B Methods for Client C
22 Klassen Object I Java är alla klasser subklasser till java.lang.object. Klassen Object innehåller följande metoder clone equals getclass hashcode tostring samt skapar en kopia av objektet. jämför om objektet är lika med ett annat objekt. returnerar vilken klass objektet tillhör vid runtime. returnerar hashkoden för objektet. returnerar en String-representation av objektet. ett antal metoder för synkronisering i multitrådade program. För att en klass skall betraktas som fullständig skall klassen överskugga metoderna tostring, clone, equals och hashcode. Särskilt gäller detta om klassen kommer att användas i ett klassbibliotek. Metoden equals() I klassen Object har metoden equals() följande utseende: public boolean equals(object obj) { return this == obj; //equals Detta betyder att om vi har två objekt betraktas de som lika endast om de är alias. Alla klasser behöver därför definiera vad som menas med att ett objekt är lika med ett annat objekt.
23 Metoden equals() equals-metoden används på många ställen i bl.a. Collectionklasserna. Här är ett typiskt exempel på användning av equals: private Object[] elementdata = ; public int indexof(object elem) { for (int i = 0; i < elementdata.length ; i++) if (elem.equals(elementdata[i]) return i; return -1; //indexof Alla klasser behöver definiera vad som menas med att ett objekt av klassen är lika med ett annat objekt. Metoden equals() Låt oss titta på klassen Triangle: import java.awt.point; public class Triangle { private Point p1, p2, p3; p1!= null && p2!= null && p3!= null **/ public Triangle(Point p1, Point p2, Point p3) { this.p1 = p1; this.p2 = p2; this.p3 = p3; //constructor //Triangle
24 Metoden equals() Vid en första anblick kan det tyckas vara enkelt att avgöra likheten mellan två objekt av klassen Triangle om samtliga tre hörnpunkter är lika i de båda trianglarna borde trianglarna vara lika. Detta leder således till att equals-metoden skulle få följande utseende: //-- Felaktig --// public boolean equals(object otherobject) { if (!(otherobject instanceof Triangle)) return false; Triangle other = (Triangle) otherobject; return p1.equals(other.p1) && p2.equals(other.p2) && p3.equals(other.p3) ; //equals Metoden equals() Låt oss nu göra ett litet testprogram Triangle t1 = new Triangle(new Point(0,0), new Point(1,1), new Point(1,0)); Triangle t2 = new Triangle(new Point(2,2), new Point(4,3), new Point(1,0)); Triangle t3 = new Triangle(new Point(0,0), new Point(1,1), new Point(1,0)); System.out.println(t1.equals(t2)); System.out.println(t1.equals(t3)); Utskriften blir vad vi förväntar oss: false true d.v.s. att t1 och t2 är olika, samt att t1 och t3 är lika.
25 Metoden equals() Låt oss nu krångla till det hela genom att införa en subklass ColoredTriangle till klassen Triangle. import java.awt.point; import java.awt.color; public class ColoredTriangle extends Triangle { private Color color; color!= null && p1!= null && p2!= null && p3!= null /** public ColoredTriangle(Color color, Point p1, Point p2, Point p3) { super(p1, p2, p3); this.color = color; Triangle //constructor ColoredTriangle -p1: Point -p2: Point //ColoredTriangle -p2: Point -color: Color -p3: Point -p3: Point Metoden equals() Låt oss nu göra ett nytt testprogram: Triangle t1 = new Triangle(new Point(0,0), new Point(1,1), new Point(1,0)); Triangle t2 = new Triangle(new Point(2,2), new Point(4,3), new Point(1,0)); ColoredTriangle t3 = new ColoredTriangle(Color.GREEN, new Point(0,0), new Point(1,1), new Point(1,0)); System.out.println(t1.equals(t2)); System.out.println(t1.equals(t3)); Utskriften blir false true d.v.s. att t1 och t3 är lika. Men är verkligen ett objekt av klassen Triangle lika med ett objekt av klassen ColoredTriangle?? Vi måste i metoden equals ta hänsyn till vilka typer som objekten i jämförelsen har.
26 Metoden equals() I klassen Object finns metoden getclass() som returnerar vilken runtime-klass ett objekt har. Denna metod kommer nu väl till pass //-- Fortfarande felaktig --// public boolean equals(object otherobject) { if (otherobject.getclass()!= this.getclass()) return false; Triangle other = (Triangle) otherobject; return p1.equals(other.p1) && p2.equals(other.p2) && p3.equals(other.p3); //equals Testkör vi nu med samma exempel som tidigare får vi med denna variant av equals-metoden utskriften false false Detta resultat är vad vi vill ha. Dock är equals-metoden fortfarande inte korrekt! Metoden equals() I The Java Language Specification anges att equals-metoden skall ha följande egenskaper: Skall vara reflexiv: För varje icke-null referens x skall det gälla att x.equals(x) returnerar true. Skall vara symmetrisk: För alla referenser x och y skall det gälla att x.equals(y) returnerar true om och endast om y.equals(x) returnerar true. Skall vara transitiv: För alla referenser x, y och z skall gälla att om x.equals(y) returnerar true och y.equals(z) returnerar true så skall också x.equals(z) returnera true. Skall vara konsistent: Om objekten till vilka x och y refererar inte har förändrats skall upprepade anrop av x.equals(y) returnera samma värde. För alla icke-null referenser x skall gälla att x.equals(null) skall returnera false.
27 Metoden equals() I equals-metoden för klassen Triangle måste vi ta hand om fallet då objektet som jämförelsen utförs mot är null. //-- Slutlig version av equals i klassen Triangle--// public boolean equals(object otherobject) { if (this == otherobject) Effektivast att först jämföra på alias return true; if (otherobject == null) return false; if (otherobject.getclass()!= this.getclass()) return false; Triangle other = (Triangle) otherobject; return p1.equals(other.p1) && p2.equals(other.p2) && p3.equals(other.p3) ; //equals Metoden equals() Vad händer när följande kod körs? ColoredTriangle ct1 = new ColoredTriangle(Color.RED, new Point(0,0), new Point(1,1), new Point(1,0)); ColoredTriangle ct2 = new ColoredTriangle(Color.BLUE, new Point(0,0), new Point(1,1), new Point(1,0)); System.out.println(ct1.equals(ct2)); Utskriften blir true ColorTriangle ärver equals-metoden från Triangle, och metoden equals i Triangle beaktar inte komponenten color. Även klassen ColoredTriangle måste överskugga equals-metoden!!
28 Metoden equals() Metoden equals i klassen ColoredTriangle får följande utseende: //-- equals i klassen ColoredTriangle--// public boolean equals(object otherobject) { return super.equals(otherobject) && color.equals(((coloredtriangle) otherobject).color) ; //equals Den som är observant, har naturligtvis konstaterat att vi definierat likhet mellan två trianglarna genom att instansvariablerna p1 är lika, p2 är lika och p3 är lika. Men trianglarna kan vara lika även i andra situationer. Detta överlåtes dock som övning. Ett dilemma Antag att vi har tre variabler t1, t2, och t3 som är deklarerade av typen Triangle. Antag också att de trianglar som dessa variabler refererar till, samtliga har samma hörnpunkter. Betraktade som objekt av typen Triangle är de således lika. Men antag nu att t2 i verkligheten refererar till ett objekt av typen ColoredTriangle, utan att användaren är medveten om detta. Detta innebär att t1.equals(t3) och t2.equals(t3) ger olika värden (true respektive false), vilket inte är vad användaren förväntar sig. Våra equals-metoder bryter således mot Liskov Substitution Principle!
29 Lösning på dilemmat Det finns ingen bra lösning på detta dilemma, utan är beroende på hur klasserna skall användas: 1. ta bort equals-metoden i ColoredTriangle. Innebär att två objekt av klassen ColoredTriangle betraktas som lika även om de har olika färg. 2. ta bort equals-metoden i Triangle. Detta innebär att två objekt av klassen Triangle betraktas som lika endast om de är alias. 3. ta bort superklass/subklass förhållandet mellan Triangle och ColoredTriangle. Innebär att vi förlorar möjlighet till polymorfism. 4. acceptera att vi bryter mot LSP. Metoden hashcode() Metoden hashcode() skall alltid överskuggas när man överskuggar equalsmetoden. Motiveringen är att när man lagrar ett objekt i en hashtabell skall två objekt som är lika ha samma hashkod för att hamna på samma plats i tabellen. Platsen ges av värdet som metoden hashcode returnerar, vilket är ett stort heltal. Om x.equals(y), så är x.hashcode() == y.hashcode() Har man en klass för vilken man skall omdefiniera metoden hashcode räcker det i allmänhet att nyttja attributens hashkoder och addera dessa. Möjligen att också multiplicera koderna med ett primtal innan additionen. //-- hashcode för klassen Triangle --// public int hashcode() { return 7*p1.hashCode() + 11*p2.hashCode() + 13*p3.hashCode(); //hashcode //-- hashcode för klassen ColoredTriangle --// public int hashcode() { return 17*super.hashCode() + 19*color.hashCode(); //hashcode
Föreläsning 7. public int getlongitude() { return longitude; }//getlongitude public Date gettimestamp() { return timestamp; }//gettimestamp }//GeoTag
Muterbara kontra icke-muterbara klasser Föreläsning 7 Eleganta klasser Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Single Responsibility Principle Information Expert Law of
Föreläsning 7. Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Metoden equals()
Föreläsning 7 Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Metoden equals() Muterbara kontra icke-muterbara klasser Objekt som tillhör en icke-muterbar klass kan inte ändra
Föreläsning 7. Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Metoden equals()
Föreläsning 7 Muterbara och icke-muterbara klasser Delegering Gränssnittet för en klass Metoden equals() Muterbara kontra icke-muterbara klasser Objekt som tillhör en icke-muterbar klass kan inte ändra
Föreläsning 3. Muterbara och icke-muterbara klasser. Delegering. Gränsnittet för en klass
TDA550 Objektorienterad programmering, fortsättningskurs Föreläsning 3 Muterbara och icke-muterbara klasser Delegering Gränsnittet för en klass Objektorienterad programmering fk 1 Föreläsning 3 Sidoeffekter
Mutability och State. Objekt-orienterad programmering och design Alex Gerdes, 2018
Mutability och State Objekt-orienterad programmering och design Alex Gerdes, 2018 Immutability E" icke muterbart (immutable) objekt är e" objekt vars 5llstånd inte kan förändras e;er a" det skapats. Mutability
Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018
Mutability och State Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018 Immutability Ett icke muterbart (immutable) objekt är ett objekt vars tillstånd inte
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2 Pelle Evensen, Daniel Wetterbro 5 november 2009 Sammanfattning Denna vecka ska vi titta på abstrakta klasser kontra interface,
Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016
Objektorienterad Programkonstruktion Föreläsning 2 2 nov 2016 Objekt - klass Namn Fält1 Fält2 Fält3 Metod1 Metod2 Metod3 Metod4 Objekt - klass Objekt - klass Objekt - klass + Objekt - klass public class
Föreläsning 8 - del 2: Objektorienterad programmering - avancerat
Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Johan Falkenjack johan.falkenjack@liu.se Linköpings universitet Sweden December 4, 2013 1 Innehåll Arv och andra viktiga begrepp Abstrakta
TDDD78 Viktiga begrepp, del 2
jonas.kvarnstrom@liu.se 2015 TDDD78 Viktiga begrepp, del 2 Identitet och likhet Är likhet och identitet samma sak? Oj, vi har samma kläder på oss idag! Nej, men likadana! Besserwisser 3 Detta är två rutor
Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private
Inkapsling tumregler Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler Tobias Wrigstad (baserat på material från Tom Smedsaas) 5 november 2010 1. Man skall
public och private Obs: private inte skyddar mot access från andra objekt i samma klass.
public och private En metod som är public får anropas från alla metoder i alla klasser. Ett attribut som är public får avläsas och ändras från alla metoder i alla andra klasser. En metod som är private
Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.
TDA550 - Objektorienterad programvaruutveckling, fk Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone. Uppgift 1 Icke-muterbarhet kontra
Föreläsning 13 Innehåll
Föreläsning 13 Innehåll Arv Repetition Om tentamen Datavetenskap (LTH) Föreläsning 13 HT 2017 1 / 32 Diskutera Här är början på klassen MemoryWindow som använts på en lab. Vad kan menas med extends SimpleWindow?
Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Innehåll Föreläsning 8 Två designmönster, MVC och Observer/Observable. Designrekommendation
Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes
Idag statiska metoder och variabler private/public/protected final, abstrakta klasser, gränssnitt, delegering wrapper classes ett lite större exempel Objectorienterad programmering Sida 1 Vad vi vet om
Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 5 Innehåll Subklasser och arv Inledning till grafik (JFrame och JPanel).
2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning
2I1049 Föreläsning 5 Objektorienterad programmering i Java KTH-MI Peter Mozelius Objektorientering Världar uppbyggda av objekt Inte helt olikt vår egen värld Ett sätt att modularisera våra system Objekten
JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012
DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012 Innehåll Testning med JUnit Refactoring Några designprinciper JUnit Ramverk i Java för testning av Java-klasser Utvecklat av Gamma
Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }
En klassdefinition class A extends B {... Arv definierar en klass A som ärver av B. Klassen A ärver alla fält och metoder som är definierade för B. A är en subklass till B. B är en superklass till A. class
F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander
F8 - Arv ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se Arv och subklasser Klasser innehåller attribut och beteenden En subklass ärver dessa från föräldern Detta ger: Återanvänd kod
Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser
Föreläsning 5-6 Innehåll Exempel på program med objekt Skapa och använda objekt Skriva egna klasser public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600,
Föreläsning 5-6 Innehåll
Föreläsning 5-6 Innehåll Skapa och använda objekt Skriva egna klasser Datavetenskap (LTH) Föreläsning 5-6 HT 2017 1 / 32 Exempel på program med objekt public class DrawSquare { public static void main(string[]
12. Relationer och funktioner
Objektorienterad modellering och diskreta strukturer 12. Relationer och funktioner Sven Gestegård Robertz Institutionen för datavetenskap, LTH 2013 Laboration 4 Syntaxanalys Grammatik för (vår delmängd
Classes och Interfaces, Objects och References, Initialization
Classes och Interfaces, Objects och References, Initialization Objekt-orienterad programmering och design (DIT953) Niklas Broberg/Johannes Åman Pohjola, 2018 Abstract class En abstract class är en class
1 Comparator & Comparable
1 Comparator & Comparable 1.1 Implementation av Comparable Att implementera Comparable innebär att man gör objekt av sin klass jämförbara med andra och att det därmed antas existera en naturlig ordning
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3 Pelle Evensen, Daniel Wetterbro 16 oktober 2012 Sammanfattning Denna vecka ska vi titta på polymorfism, dynamisk kontra statisk
Kopiering av objekt i Java
1 (6) Kopiering av objekt i Java Först När du läser detta papper bör du samtidigt studera dokumentationen för klasserna Object, Cloneable (java.lang) och ArrayList (java.util). Mycket blir klarare genom
Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och
Innehåll u OOP snabbintroduktion u Datatyper u Uttryck u Satser u Arv (intro) u Programvaruutveckling och programmering u Klassdesign och metodik (UML, CRC) u Arv, polymorfi och dynamisk bindning u Fält
Att skriva till och läsa från terminalfönstret
Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen
Enkla variabler kontra referensvariabel
Enkla variabler kontra referensvariabel En variabel är ett namngivet minnesutrymme i datorns primärminne. En variabel som används för att representera en primitiv datatyp kallas för enkel variabel. Deklarationssatsen
Lösningsförslag. 1 Lösningsförslag. Uppgift 1
Uppgift 1 Lösningsförslag import java.awt.rectangle; public class ImprovedRectangle extends Rectangle { public ImprovedRectangle(int width, int height) { super(width, height); public ImprovedRectangle(int
DAT043 - Föreläsning 7
DAT043 - Föreläsning 7 Model-View-Controller, mer om klasser och interface (arv, ) 2017-02-06 Designmönstret Observer avläser Observer Observable meddelar Observer avläser En eller flera objekt registrerar
Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering
Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering Institutionen för Datavetenskap CTH HT-6, TDA540 Dag: 207-0-24, Tid: 4.00-.00 Uppgift a) En abstrakt klass kan inte instansieras,
SI-pass 4. Johan Brook och Jesper Persson. 25 september 2012. Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.
SI-pass 4 Johan Brook och Jesper Persson 25 september 2012 1. Sant eller falskt? Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner. Interfaces i Java kan innehålla privata
Repetition av OOP- och Javabegrepp
ArrayList Repetition av OOP- och Javabegrepp En lista i vilken man kan lagra objekt Implementerar List-interfacet Skiljer sig från ett vanligt endimensionellt fält: Dynamisk expanderar när den blir
Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.
DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/3 2017 Innehåll Abstrakta klasser Klasshierarki och typhierarki Polymorfism och dynamisk bindning Polymorfi-exempel: Schack Klassen Object
Objektsamlingar i Java
1 (6) Objektsamlingar i Java Objektorienterad programmering 3 Syfte Att ge träning i att använda objektsamlingar i Java. Mål Efter övningen skall du kunna använda objektsamlingsklasserna ArrayList och
Repetition av OOP- och Javabegrepp
ArrayList Repetition av OOP- och Javabegrepp En lista i vilken man kan lagra objekt Implementerar List-interfacet Skiljer sig från ett vanligt endimensionellt fält: Dynamisk expanderar när den blir
Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016
Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Abstract class En abstract class är en class som inte kan skapa några objekt. Syfte:
Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.
-Algoritmer och Datastrukturer- Abstrakt datatyp Datatyp för en variabel Betecknar i ett programmeringsspråk den mängd värden variabeln får anta. T ex kan en variabel av typ boolean anta värdena true och
Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.
DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/4 2014 Innehåll Abstrakta klasser Klasshierarki och typhierarki Polymorfism och dynamisk bindning Polymorfi-exempel: Schack UML-översikt
Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:
Klasser och objekt Ett program i Java är en modell som används för att simulera uppträdandet hos en verklig eller påhittad värld. I ett objektorienterat programspråk modelleras den värld som man vill avbilda
12. Relationer och funktioner
Objektorienterad modellering och diskreta strukturer 12. Relationer och funktioner Sven Gestegård Robertz Datavetenskap, LTH 2014 Laboration 4 Syntaxanalys Grammatik för (vår delmängd av) satslogiska uttryck
Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.
TDA550 - Objektorienterad programvaruutveckling IT, fk Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone. Uppgift 1 Icke-muterbarhet
Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018
Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018 Implementation inheritance Subclassing, eller implementation inheritance (implementationsarv), ger oss
TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?
TDDD78 Objektorientering i Java, del 4 Hur vet man om två objekt är lika? Hur undviker man objekt och när? jonas.kvarnstrom@liu.se 2016 Identitet och likhet Är identitet och likhet samma sak? Oj, vi har
Konstruktion av klasser med klasser
Konstruktion av klasser med klasser Klasser kan byggas på redan denierade klasser genom att klassobjekt används som dataattribut när en ny klass beskrivs. Exempel: Klassen PairOfDice har två attribut attribut
Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier
Arv Fundamental objekt-orienterad teknik arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier Programmeringsmetodik -Java 165 Grafisk respresentation: Arv
Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018
Principles of subclasses Objekt-orienterad programmering och design Alex Gerdes, 2018 Implementation inheritance Subclassing, eller implementation inheritance (implementationsarv), ger oss två fördelar:
Föreläsning 2 Innehåll
Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga
public class BoundedCounter {
Uppgift 1 I Javas standardbibliotek finns en klass för rektanglar. Nedanstående kod visar relevanta delar av klassen: public class Rectangle {... public Rectangle(int height, int weight) {... public Rectangle(int
Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund
Föreläsning 2 Innehåll Generiska klasser Javas samlingsklasser är generiska. Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element metoden equals En generisk
LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p
UMEÅ UNIVERSITET Datavetenskap 010530 LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p Betygsgränser 3 21,5-27 4 27,5-33,5 5 34-43 Uppgift 1. (4p) Hitta de fel som finns i nedanstående klass (det
TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU
TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Mer om Interface Generiska klasser Undantag Nästlade klasser 1
Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki
Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga
EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass
EDAA20 Föreläsning 11-12 Klassen ArrayList Klassen ArrayList Skriva program som läser data från en textfil och skriver data till en textfil Repetition inför delmålskontroll 2 är en standardklass (i paketet
Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2
Övning vecka 6. TDA550 - Objektorienterad programvaruutveckling IT, fk Denna vecka ska vi titta på undantag, testning, generiska enheter, samlingar och designmönstret Iterator. Uppgift 1 Exceptions a)
Enkla variabler kontra referensvariabel
Föreläsning 6 Mer om klasser och objekt Föreläsning 6 Mer om klasser och objekt Enkla variabler kontra referensvariabel En variabel är ett namngivet minnesutrymme i datorns primärminne. En variabel som
Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler
Enkla variabler kontra referensvariabel En variabel är ett namngivet minnesutrymme i datorns primärminne. Föreläsning 6 Mer om klasser och objekt En variabel som används för att representera en primitiv
OOP Objekt-orienterad programmering
OOP F10:1 OOP Objekt-orienterad programmering Föreläsning 10 Mer om arv och klasshierarkier Interface Hierarkier - många nivåer OOP F10:2 Djur Rovdjur Hovdjur Fåglar Fiskar Björn Kattdjur Ko Lamm Hjort
Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.
Tentamen Programmeringsteknik I 2015-06-11 Skrivtid: 08:00 13:00 Hjälpmedel: Java-bok Tänk på följande Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.
Föreläsning 9-10 Innehåll
Föreläsning 9-10 Innehåll Inläsning från textfil, utskrift från textfil Vektorer med objekt Matriser Datavetenskap (LTH) Föreläsning 9-10 HT 2018 1 / 41 Klassen Scanner Läsa från System.in Vi har tidigare
Föreläsning 5. Föreläsning 5. Klasser och objekt. Klasser och objekt. Klasser och objekt
Föreläsning 5 Föreläsning 5 Klasser och objekt Klasser och objekt Klasser och objekt Ett program i Java är en modell som används för att simulera uppträdandet hos en verklig eller påhittad värld. I ett
Föreläsning 3-4 Innehåll
Föreläsning 3-4 Innehåll Skriva egna metoder Logiska uttryck Algoritm för att beräkna min och max Vektorer Datavetenskap (LTH) Föreläsning 3-4 HT 2017 1 / 36 Diskutera Vad gör programmet programmet? Föreslå
Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?
När skall man använda implementationsarv? Föreläsning 5 När skall implementationsarv användas? The Open-Closed Principle (OCP) Liskov Substitution Principle (LSP) Implementationsarv är en konstruktion
Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar
Föreläsning 9 Innehåll
Föreläsning 9 Innehåll Binära sökträd algoritmer för sökning, insättning och borttagning, implementering effektivitet balanserade binära sökträd, AVL-träd Abstrakta datatyperna mängd (eng. Set) och lexikon
Mer om klasser och objekt
Klassvariabler och klassmetoder En klass kan innehålla klassvariabler och klassmetoder. TDA143 I1 Programmerade system Föreläsning 5 (OH-bilder 5) Mer om klasser och objekt Christer Carlsson Det som skiljer
Föreläsning 2 Datastrukturer (DAT037)
Föreläsning 2 Datastrukturer (DAT037) Fredrik Lindblad 1 1 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037
Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod
Föreläsning 3-4 Innehåll Diskutera Vad gör programmet programmet? Föreslå vilka satser vi kan bryta ut till en egen metod. Skriva egna metoder Logiska uttryck Algoritm för att beräkna min och max Vektorer
Föreläsning 5. Föreläsning 5
Klasser och objekt Ett program i Java är en modell som används för att simulera uppträdandet hos en verklig eller påhittad värld. Föreläsning 5 I ett objektorienterat programspråk modelleras den värld
Kort om klasser och objekt En introduktion till GUI-programmering i Java
Kort om klasser och objekt En introduktion till GUI-programmering i Java Klasser En klass är en mall för hur man ska beskriva på något. Antag att vi har en klass, Bil. Den klassen innehåller en lista på
Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018
Modulär design Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018 Separation of Concern principle Do one thing do it well. Separation of Concern är inte specifikt
LÖSNINGSFÖRSLAG
LÖSNINGSFÖRSLAG - 100406 Uppgift 1. a) Objekten som tillhör en icke-muterbar klass är oförändliga, dvs de behåller under hela sin livstid det tillstånd som de fick när de skapades. Icke-muterbara objekt
TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU
TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Interface Generiska klasser Undantag
TENTAMEN OOP
TENTAMEN OOP 2014-01-19 ANVISNINGAR Påbörja varje ny uppgift på nytt blad. Skriv endast på ena sidan av bladen. Skriv tydligt - oläsbara svar beaktas ej. BETYGSÄTTNING Max antal poäng är 30. För att bli
Tentamen ID1004 Objektorienterad programmering October 29, 2013
Tentamen för ID1004 Objektorienterad programmering (vilande kurs), 29 oktober 2013, 9-13 Denna tentamen examinerar 3.5 högskolepoäng av kursen. Inga hjälpmedel är tillåtna. Tentamen består av tre sektioner.
Tentamen LÖSNINGSFÖRSLAG
Tentamen 170410 - LÖSNINGSFÖRSLAG Uppgift 1. public abstract class LogicInstruction implements Instruction { private BooleanOperand operand1, operand2; protected LogicInstruction(BooleanOperand operand1,
Objektorienterad programmering i Java
Objektorienterad programmering i Java Föreläsning 4 Täcker i stort sett kapitel 6 i kursboken Java Software Solutions 1 Läsanvisningar Den här föreläsningen är uppbyggd som en fortsättning av exemplet
Parameteröverföring. Exempel. Exempel. Metodkropp
Exempel atriangle.changesize (100, 50); // OK atriangle.changesize (100); // fel antal atriangle.changesize ( 1, 50); // fel datatyp char c = atriangle.getarea (); // fel datatyp Parameteröverföring I
Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.
Tentamen 101213 - LÖSNINGSFÖRSLAG Uppgift 1. a) Ger utskriften c( ) in D b) Ger utskriften true c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt. d) Ger utskriften b( )
Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER
Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER Logiska uttryck datatypen boolean Logiska uttryck kan ha två möjliga värden, true eller false. Variabler av typen boolean kan tilldelas
Föreläsning 4. Polymorfism. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder
Föreläsning 4 Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder Statiska och dynamiska typer Den deklarerade typen hos en variabel är variabelns statiska typ.
TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU
TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Konstruktorer Statiska metoder & attribut
TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P
UME UNIVERSITET Datavetenskap 981212 TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P Datum : 981212 Tid : 9-15 HjŠlpmedel : Inga Antal uppgifter : 9 TotalpoŠng : 60 (halva pošngtalet kršvs normalt fšr
Exempel på användning av arv: Geometriska figurer
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. (9 maj 2014
Lösningsförslag till tentamen
till tentamen 1 (6) Kurs Objektorienterad programmering Program D2 Läsår 2010/2011, lp 1 Examinator Uno Holmer Uppgift 1 (10 p) Ingen lösning ges. Se kurslitteraturen. Uppgift 2 (11 p) public class CounterButton
Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering
Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk
Laboration A Objektsamlingar
Laboration A Objektsamlingar Avsikten med laborationen är att du ska träna på att använda ett par objektsamlingar. Uppgift 1 Titta genom föreläsningsunderlaget DA129AFAHT07.pdf och testkör exemplen (se
TENTAMEN OOP
TENTAMEN OOP 2013-08-08 ANVISNINGAR Påbörja varje ny uppgift på nytt blad. Skriv endast på ena sidan av bladen. Skriv tydligt - oläsbara svar beaktas ej. BETYGSÄTTNING Max antal poäng är 30. För att bli
Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010
Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010 interface, motivation och bakgrund Antag att vi gör en generell listklass: public class List { protected static class ListNode { public
/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.
* * Lösningsförslag tentamen DIT950 * Datum 150317 * * -1 - För samtliga gäller,se föreläsningsanteckningar. * - 2 - (Diagram visas inte, kontakta mig för ev frågor) // a C c = new A(); // Compile! Sub
Laboration 1: Figurer i hierarki
Laboration 1: Figurer i hierarki Bakgrund Två grundläggande tekniker i objektorienterad konstruktion är arv och komposition. Mål Laborationen har flera avsikter: 1. Ge kunskaper i hur program kan organiseras
Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts
Föreläsning 11-12 Innehåll Hantera många element Tidigare har vi använt vektorer för att lagra många element av samma tp. Eempel: Klassen ArraList Inläsning från tetfil, utskrift på tetfil int[] nbrs
Tentamen ID1004 Objektorienterad programmering May 29, 2012
Omtentamen för ID1004 Objektorienterad programmering HT11, 29 maj 2012, 09-13 Denna tentamen examinerar 3 högskolepoäng av kursen. Inga hjälpmedel är tillåtna. Tentamen består av 12 frågor. Varje fråga
TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU
TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning Generiska klasser Undantag Interface Nästlade klasser 1 Problem:
Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper
Tentamen Programmeringsteknik II 2018-10-19 Skrivtid: 8:00 13:00 Tänk på följande Skriv läsligt. Använd inte rödpenna. Skriv bara på framsidan av varje papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer
Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)
Objektorienterad Programmering DAT043 Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material) 1 Metoden clone() Skapa kopior av existerande objekt. Interface Cloneable Deep vs.
Tentamen Programmering fortsättningskurs DIT950
Tentamen Programmering fortsättningskurs Datum: 2015-03-17 Tid: 08.30-12.30 Hjälpmedel: Engelskt-Valfritt språk lexikon Betygsgränser: U: -23 G: 24-43 VG: 44-60 (max 60) Lärare:. Någon besöker ca 10.00