Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler

Relevanta dokument
Enkla variabler kontra referensvariabel

Enkla variabler kontra referensvariabel

Mer om klasser och objekt

Lösningsförslag övning 2.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

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

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

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

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

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

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 5. Föreläsning 5. Klasser och objekt. Klasser och objekt. Klasser och objekt

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

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

Föreläsning 5. Föreläsning 5

Objekt och referenser

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

Föreläsning 4. Klasser och objekt

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

DAT043 - Föreläsning 7

Objekt och klasser - Introduktion

Chapter 4: Writing Classes/ Att skriva egna klasser.

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Laboration 3, uppgift En klass för en räknare

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

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

Modeller, Objekt och Klasser

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad Programmering DAT043

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

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

Malmö högskola 2008/2009 CTS

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Repetition av OOP- och Javabegrepp

Kort om klasser och objekt En introduktion till GUI-programmering i Java

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Repetition av OOP- och Javabegrepp

Grundläggande programmering med C# 7,5 högskolepoäng

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

Objektorienterad programmering i Java

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

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

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Design av en klass BankAccount som representerar ett bankkonto

Laboration 1 - Grunderna för OOP i Java

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Tentamen ID1004 Objektorienterad programmering October 29, 2013

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

Föreläsning 3-4 Innehåll

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Tentamen OOP

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

TENTAMEN OOP

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

TDDD78 Viktiga begrepp, del 2

Polymorfi. Objektorienterad och komponentbaserad programmering

Classes och Interfaces, Objects och References, Initialization

Objektorienterad programmering D2

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

Objekt, Klasser, Paket m. m.

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

Typkonvertering. Java versus C

Föreläsning REPETITION & EXTENTA

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 11

(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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

Del A (obligatorisk för alla)

1 Egna klasser. 1.1 En punkt-klass

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

Transkript:

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 datatyp kallas för enkel variabel. Deklarationssatsen int number = ; innebär att en heltalsvariabel number deklareras och initieras till värdet. Detta kan illustreras med vidstående bild: värdet av variabeln number 12345 12346 12347 12348 12349 12350 Föreläs En variabel som används för att representera en instans av en klass kallas för referensvariabel. Deklarationssatsen Integer numobject = new Integer(); innebär att en referensvariabel numobject av typen Integer deklareras och initieras till att referera till ett objekt av typen Integer som har värdet. Detta kan illustreras med vidstående bild: adressen till objektet objektet som refereras numobject 12349 12345 12346 12347 12348 12349 12350 2 Mer om klasse Referensvariabler Omslagsklassen Integer En referensvariabel är en variabel som kan lagra adresser och vars datatyp är en klass: Rectangle rectangle; rectangle??? 15678 15679 Enda sättet att skapa ett objekt är med operatorn new (och en konstruktor): rectangle = new Rectangle(40, 60); Följande händer vid anrop av konstruktorn: 1. Minne för objektets instansvariabler allokeras på någon ledig adress och detta minne nollställs. 2. Eventuella initieringar av instansvariablerna görs och satserna i konstruktorn exekveras. width 0000000000 height 0000000000 width 40 height 60 42645 42646 42645 42646 3. Adressen till minnet som allokerades för objektet ges som returvärde från konstruktorn. rectangle 42645 15678 15679 3 4

Omslagsklassen Integer Skillnaden mellan en variabel och en referensvariabel Om vi gör nedanstående deklarationer int num1 = ; int num2 = ; kan detta illustreras med följande bild num1 num2 Görs sedan satsen num2 = num1; får vi bilden num1 num2 Värdet har kopierats till minnesutrymmet 5 6 Skillnaden mellan en variabel och en referensvariabel Om vi gör nedanstående deklarationer Integer numobject1 = new Integer(); Integer numobject2 = new Integer(); kan detta illustreras med följande bild: Görs sedan satsen numobject2 = numobject1; får vi bilden: numobject1 numobject1 numobject2 numobject2 Adressen har kopierats till minnesutrymmet Ett litet program public class TestRectangle { public static void main (String[] args) { Rectangle rec1 = new Rectangle(, ); Rectangle rec2 = new Rectangle(150, 98); System.out.println("Rec1:\n" + rec1 + "\nrec2: \n" + rec2); rec2 = rec1; rec1.setwidth(50); rec2.setheight(0); System.out.println("Rec1:\n" + rec1 + "\nrec2: \n" + rec2); //main //TestRectangle Vad blir utskriften? 7 8

Förklaring När är två objekt lika? Rectangle rec1 = new Rectangle(, ); Rectangle rec2 = new Rectangle(150, 98); rec1 rec2 150 98 Om vi gör följande deklarationer Integer numobject1 = new Integer(); Integer numobject2 = new Integer(); kan detta illustreras med följande bild: numobject1 numobject2 rec2 = rec1; rec1 rec2 Vad kommer jämförelsen (numobject1 == numobject2) 150 98 att få för värde? rec1 rec2 rec1.setwidth(50); rec2.setheight(0); 50 0 150 98 Resultatet blir false, eftersom det är referenserna till objekten som jämförs!! Operatorn '==' jämför på identitet, inte på likhet! 9 Metoden equals För att jämföra likhet på själva objekten tillhandahåller klassen Integer instansmetoden equals. Anropet numobject1.equals(numobject2) kommer att returnera värdet true. Alla klasser ärver metoden equals från klassen Object, men denna metod jämför på identitet (==). Vill man jämföra två objekt av en viss klass på likhet måste klassen överskugga instansmetoden equals. Uppgift: numobject1 Utöka klassen Rectangle med instansmetoden equals som jämför om två objekt är lika! Hur skall likhet definieras? numobject2 equal jämför värdet av objekten Implementation av equals i Rectangle public class Rectangle { private double width; private double height;... public boolean equals(object otherobject) { if (this == otherobject) return true; if (otherobject == null) if (otherobject.getclass()!= this.getclass()) Rectangle other = (Rectangle) otherobject; return this.width == other.width && this.height == other.height; //equals //Rectangle Konstruktorer och metoder har i en klass access till instansvariablerna i alla objekt av klassen! Det aktuella objektet (this) har således access till instansvariablerna hos objektet other även om dessa är angivna som private! 11 12

Default-konstruktor Om man i en klass inte definierar någon konstruktor, skapas automatiskt en parameterlös default-konstruktor. Denna konstruktor är ekvivalent med den explicita definitionen: public SomeClass(){ Om någon konstruktor definieras i klassen skapas ingen default-konstruktor. Om man då vill ha tillgång till en parameterlös konstruktor måste denna definieras i klassen: public SomeClass(int value){ //some stuff public SomeClass(){ Om klassen endast har behov av den parameterlösa konstruktorn är det bättre att göra en explicit definition av denna än att nyttja default-konstruktorn. Klassvariabler och klassmetoder En klass kan innehålla klassvariabler och klassmetoder. Det som skiljer en klassvariabel från en instansvariabel och en klassmetod från en instansmetod är att: klassvariabler och klassmetoder är gemensamma för alla objekt som tillhör en klass instansvariabler och instansmetoder finns i unika uppsättningar i varje objekt som tillhör en klass. Detta betyder att: metoder som påverkar någon instansvariabel eller behöver tillgång till någon instansvariabel för att kunna fullgöra sin uppgift, måste implementeras som instansmetoder metoder som inte påverkar eller behöver tillgång till någon instansvariabel (måste inte men) skall implementeras som klassmetoder. 13 14 Exempel: Klassvariabler och klassmetoder Antag att vi har en klass Person för att avbilda personer. Antag vidare att vi i ett program skapat instanserna kalle och stina av klassen Person Person kalle = new Person("Kalle"); Person stina = new Person("Stina"); I klassen Person finns vidare metoderna getphonenumber() och getphonenumber(person p) som t.ex kan anropas på följande sätt: PhoneNumber number1 = kalle.getphonenumber(); PhoneNumber number2 = kalle.getphonenumber(stina); som levererar svaren på frågorna: Kalle, vad har du för telefonnummer? respektive Kalle, vilket telefonnummer har Stina? Metoden getphonenumber() måste vara en instansmetod, medan metoden getphonenumber(person p) skall vara en klassmetod. Varför? 15 Klassvariabler och klassmetoder Modifieraren static används för att ange att en variabel är en klassvariabel respektive att en metod är en klassmetod: private static double rate; public static final double G = 6.6743e-11; public static double getphonenumber(person p) {... //getphonenumber public static void main(string[] arg) {... //main 16

Klassvariabler och klassmetoder Access till publika klassattribut fås genom att ange klassens namn, följt av en punkt '.', följt av attributets namn Math.PI Interger.MAX_VALUE Access till publika klassmetoder fås genom att ange klassens namn, följt av en punkt '.', följt av metodens namn och argumentlista. String indata = JOptionPane.showInputDialog("Ge talet:"); double tal1 = Double.parseDouble(indata); double tal2 = Math.pow(tal1, 3); System.out.println("Det beräknade talet blev: " + tal2); Har man skapat objekt av en klass kan, men skall inte, klassvariabler och klassmetoder refereras via dessa objekt. Varför inte? Ger otydlig kod! PhoneNumber number2 = kalle.getphonenumber(stina); PhoneNumber number2 = Person.getPhoneNumber(stina); 17 Exempel: Klassvariabler och klassmetoder Skapa en klass Account för att avbilda bankkonton. Ett konto skall innehålla uppgifter om vem som äger kontot kontonummer saldo räntesats På ett konto skall det vara möjligt att göra transaktioner (insättningar eller uttag) ta reda på räntesatsen ta reda på saldo ta reda på kontots ägare ta reda på kontots kontonummer ändra räntesats lägga till årsräntan Alla konton skall ha samma räntesats. Alla konton skall ha unika kontonummer, vilket är ett löpnummer i den ordning konton skapas. 18 Implementation av klassen Account public class Account { private static double rate; //klassvariabel private static int currentnr = 0; //klassvariabel private double balance; //instansvariabel private String owner; //instansvariabel private int number; //instansvariabel public Account(String owner) { this.owner = owner; public String getowner() { currentnr = currentnr + 1; return owner; number = currentnr; //getowner //constructor public void transaction(double amount) { public static void setrate(double newrate) { if (amount < 0 && balance + amount < 0) rate = newrate; System.out.println("Not money enought!!"); //setrate else public static double getrate() { balance = balance + amount; return rate; //transaction //getrate public void addinterest(double interest) { public double getbalance() { balance = balance + balance*interest; return balance; //addinterest //getbalance //tostring och equals bör också implementeras public int getnumber() { //Account return number; //getnumber 19 Klassvariabler och klassmetoder Antag att följande satser har gjorts: Account account1 = new Account("Kalle"); Account account2 = new Account("Stina"); Account.setRate(0.024); account1.transaction(0); account2.transaction(300); Account.setRate(0.021); Vidstående bild illustrerar vilka objekt som finns samt vilka värden respektive instansvariabel och klassvariabel har. En klassmetod får inte referera till någon instansvariabler! Varför? instans av rate currentnr account1: Account balance owner number 0 "Kalle" double getbalance() int getnumber() String getowner() void transaction(double amount) void addinterest(double interest) 1 Account 0.021 2 void setrate(double rate) double getrate() instans av account2: Account balance owner number 300 "Stina" double getbalance() int getnumber() String getowner() void transaction(double amount) void addinterest(double interest) 2

Oföränderliga objekt public class Location { private int row; private int col; public Location(int row, int col) { this.row = row; this.col = col; //constructor public int getrow() { return row; //getrow public int getcol() { return col; //getcol Man skall inte slentrianmässigt tillhandahålla omformare i alla klasser. Om en klass saknar omformare kan inte tillståndet hos ett objekt av denna klass förändras. Objektet är oföränderligt (icke-muterbart). Det tillståndet som objektet initieras till när det skapas kommer att kvarstå under objekts hela livstid. public boolean equals(object otherobject) { if (this == otherobject) if (otherobject == null) if (otherobject.getclass()!= this.getclass()) Location other = (Location) otherobject; return row == other.getrow() && col == other.getcol(); //equals public String tostring() { return "(" + row + ", " + col + ")"; //tostring //Location Uppgift: Frågor att ta ställning till: Vad skall vi kalla klassen? - vi döper klassen till Die Problemexempel Utveckla en klass för att avbilda tärningar. Vilket beteende har en tärning ( = vad vill man kunna göra med en tärning)? - slå tärningen - läsa av värdet på tärningen Vilka tillstånd kan en tärning ha? - värdet, dvs vilken siffra har ovansidan på tärningen 21 22 Specifikation av klassen Die För att handha tärningens värde behövs en instansvariabel, som vi kan kalla dots. Eftersom värdet är ett heltal skall dots vara av typen int: private int dots; För att kasta tärningen behövs en instansmetod som slumpmässigt ändrar tärningens värde, låt oss kalla denna metod för roll: public void roll() kastar tärningen För att läsa av tärningens värde behövs en instansmetod som returnerar värdet av instansvariabeln dots: public int getvalue() returnerar tärningens värde Vi väljer att låta klassen ha två konstruktorer. Den första konstruktorn sätter ett slumpmässigt startvärde (mellan 1 och 6) på tärningen. Den andra konstruktorn tillåter användaren att initiera tärningens startvärde. public Die() skapar en tärning med en slumpmässig sida upp public Die(int dots) skapar en tärning med sidan dots upp Metoden roll använder ett objekt av klassen Random för att erhålla ett slumpmässigt värde. Detta objekt görs till en klassvariabel. private static Random dicerandom = new Random(); 23 Implementering av klassen Die import java.util.random; public class Die { private int dots; private static Random dierandom = new Random(); public Die() { roll(); //constructor public Die(int dots) { if (dots >= 1 && dots <= 6) this.dots = dots; else roll(); //constructor public int getvalue() { return dots; //getvalue public void roll() { dots = dierandom.nextint(6) + 1; //roll //Die Varför har dierandom implementerats som en klassvariabel? Finns det något snyggare sätt att lösa problemet som uppstår då användaren ger ett otillåtet värde på parametern? Varför finns det ingen metod setvalue för att ändra värdet på instansvariabeln dots? 24

Alternativ implementation: kastar ett exception Problemexempel import java.util.random; public class Die { private int dots; private static Random dierandom = new Random(); public Die() { roll(); //constructor public Die(int dots) { if (dots < 1 dots > 6) throw new IllegalArgumentException(); else this.dots = dots; //constructor public int getvalue() { return dots; //getvalue public void roll() { dots = dierandom.nextint(6) + 1; //roll //Die Exceptions kommer att diskuteras något mer utförligt senare i kursen. 25 Använd klassen Die för att skriv ett program som genom simulering beräknar sannolikheten för att erhålla den sammanlagda summan 7 när man kastar två tärningar. Analys: Diskussion: För att beräkna sannolikheten görs ett tillräckligt stort antal kast med tärningarna. Vi räknar hur många gånger de båda tärningarnas sammanlagda värde blir 7. Detta antal dividerat med totala antalet tärningskast ger sannolikheten för att erhålla värdet 7. Utdata: Sannolikheten att erhålla värdet 7. 26 Design: Algoritm: 1. Sätt nrofseven till 0. 2. Upprepa nrofturns gånger 2.1. Kasta tärning t1. 2.2. Kasta tärning t2. 2.2. Läs av tärningarnas värden och lagra den sammanlagda summan i sum. 2.3. Om sum har värdet 7 så öka nrofseven med 1. 3. Skriv ut värdet av nrofseven / nfofturns Datarepresentation: Tärningarna t1 och t2 är av klassen Die. nrofseven, nrofturns och sum är av typen int. Implementation: // Programmet beräknar genom simulering sannolikheten för att erhålla // värdet 7 vid kast med två tärningar public class TestTwoDie { public static void main (String[] args) { Die die1 = new Die(); Die die2 = new Die(); final int nrofturns = 0000; int sum; int nrofseven = 0; for (int i = 1; i <= nrofturns; i = i + 1) { die1.roll(); die2.roll(); sum = die1.getvalue() + die2.getvalue(); if (sum == 7) nrofseven = nrofseven + 1; Använd top-down design och generalisera så att sannolikheten för andra värden än 7 också kan beräknas. System.out.println("Sannolikheten att få värdet 7 är " + ((double) nrofseven) / nrofturns); // main //TestTwoDie 27 28

Implementation: public class TestTwoDie { public static void main (String[] args) { Die d1 = new Die(); Die d2 = new Die(); double percentage = Utility.computeProbability(d1, d2, 7, 0000); System.out.println("Sannolikheten att få värdet 7 är är " + percentage); //main //TestTwoDie public class Utility { public static double computeprobability(die die1, Die die2, int target, int nrofturns) { int sum; int nroftarget = 0; 0; for (int i = 1; 1; i <= nrofturns; i = i + 1) { die1.roll(); die2.roll(); sum = die1.getvalue() + die2.getvalue(); if if (sum == target) nroftarget = nroftarget + 1; 1; return (double) nroftarget // nrofturns; //computeprobability //Utility Interface En tärning förknippas vanligtvis med 6 sidor, som i klassen Die. Men det finns tärningar med annat antal sidor än 6. Det som är gemensamt för alla tärningar, oavsett antalet sidor, är att de kan kastas och att man kan avläsa vilket värde som kom upp. De har samma gränssnitt. I Java finns en särskild konstruktion interface som kan ses som specifikationen för en klass, där gränssnittet för klassen anges men implementationen saknas. public interface Rollable { public void roll(); public int getvalue(); //Rollable 29 30 En alternativ realisering av tärning är att implementera interfacet Rollable. Enda ändringen i koden är att ange implements Rollable i klasshuvudet (för tydlighetens skull byter vi också namnet på klassen till SimpleDie). Både en klass och ett interface definierar en datatyp. Om en klass implementerar ett interface blir klassens datatyp en subtyp till datatypen för interfacet. En instans av klassen SimpleDie kommer därför att tillhöra både datatypen SimpleDie och datatypen Rollable. Interface Klassen SimpleDie implementerar interfacet Rollable import java.util.random; public class SimpleDie implements Rollable { private int dots; private static Random dierandom = new Random(); public Die() { roll(); //constructor public SimpleDie(int dots) { if (dots < 1 dots > 6) throw new IllegalArgumentException(); else this.dots = dots; //constructor public int getvalue() { return dots; //getvalue public void roll() { dots = dierandom.nextint(6) + 1; //roll //SimpleDie 31 Interface Om vi betraktar metoden computeprobability, ser vi att metoden har två referenser av typen Die. För dessa referenser anropar computeprobability metoderna roll() och getvalue(). public static double computeprobability(die die1, Die die2, int target, int nrofturns) { int sum; int nroftarget = 0; for (int i = 1; i <= nrofturns; i = i + 1) { die1.roll(); die2.roll(); sum = die1.getvalue() + die2.getvalue(); if (sum == target) nroftarget = nroftarget + 1; return (double) nroftarget / nrofturns; //computeprobability Eftersom metoderna roll() och getvalue() specificeras av interfacet Rollable, kan datatypen på referenserna die1 och die2 bytas till Rollable: public static double computeprobability(rollable die1, Rollable die2, int target, int nrofturns) 32

Interface Relationer mellan objekt public static double computeprobability(rollable die1, Rollable die2, int target, int nrofturns) { int sum; int nroftarget = 0; I Java gäller att: for (int i = 1; i <= nrofturns; i = i + 1) { die1.roll(); där det efterfrågas ett värde av datatypen die2.roll(); C får man även ge ett värde som är en sum = die1.getvalue() + die2.getvalue(); subtyp if (sum == target) till C nroftarget = nroftarget + 1; Det vi åstadkommit är att metoden return (double) nroftarget / nrofturns; computeprobability kan användas för alla //computeprobability instanser av klasser som implementerar interfacet Rollable. Antag att vi har en klass EightSideDie, som avbildar en tärning med 8 sidor, som implementerar interfacet Rollable. För att ta reda på sannolikheten för att få värdet 12 när man kastar två tärningar där den ena tärningen har 6 sidor och och den andra tärningen 8 sidor kan detta göras genom att anropa metoden computeprobability enligt: I objektorienterad programmering samverkar ett antal objekt för att lösa ett givet problem. Objekten kan sinsemellan ha olika relationer. Är -relationen: Innebär att en instans av en klass, förutom att tillhöra datatypen som definieras av klassen, även är en subtyp till en annan datatyp. Används för att bygga hierarkiska relationer. Åstadkoms genom att en klass implementerar ett interface (specifikations arv) eller att en klass utökar en annan klass (implementations arv). Arv kommer att behandlas utförligare senare i kursen. Exempel: Ett objekt av typen Die är ett objekt av typen Rollable. En partiledare är politiker. En politiker är en person. double percentage = Utility.computeProbability(new SimpleDie(), new EightSideDie(), 12, 0000); 33 34 Relationer mellan objekt Har -relationen: Exempel: Innebär att ett objekt är uppbyggt av andra objekt. Är ett sätt att bygga upp ett system från delar där delarna göms för omgivningen. Endast helheten är synlig. Kallas även för komposition En bil har en motor En bil har en ratt public class Car { private Engine engine = new Engine(1); private SteeringWheel wheel = new SteringWheel(); //stuff not shown here public void start() { engine.turnon(); //Car Delarna skapas i klassen och är okända utanför klassen 35 Relationer mellan objekt Känner till -relationen: Innebär att det finns en relation mellan två objekt som har skapats oberoende av varandra och som kan fortleva utan varandra. Om objekt A känner till objekt B är objekt B, på ett eller annat sätt, synligt utanför objekt A. Exempel: En bil känner till sin förare public class Car { private Engine engine = new Engine(1); private SteeringWheel wheel = new SteringWheel(); private Person driver; //stuff not shown here public void changedriver(person driver) { this.driver = driver; //Car Objektet driver har skapats någon annanstans 36