Idag ska vi gå igenom. Programmeringsteknik för S, 2004 Grupp IV. Vad är en klass? Klasser och instanser

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

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

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

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

Laboration 1 - Grunderna för OOP i Java

Programmeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner

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 2 Objektorienterad programmering DD1332. Typomvandling

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

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

Lösningsförslag övning 2.

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

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

(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

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

Dagens program. Programmeringsteknik och Matlab. Viktiga datum. Ett första exempel. Programmall, vad behöver vi i ett javaprogram?

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

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

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Klasser och objekt. Henrik Johansson. August 20, 2008

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

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.

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

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

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

JAVA Mer om klasser och objektorientering

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.

Malmö högskola 2008/2009 CTS

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

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

Föreläsning 3-4 Innehåll

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

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

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

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

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

TDDC77 Objektorienterad Programmering

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

Programmering för språkteknologer II, HT2011. Rum

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

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

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.

2 b) Följande finns definierat: import java.awt.*; public class Uppgift1b public static void main(string[] mupp) Color färg = Color.blue; Bil[] bilar

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Tentamen OOP

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

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

Enkla variabler kontra referensvariabel

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

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

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

Objektorienterad programmering i Java

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning REPETITION & EXTENTA

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

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

Objektorientering: Lagring, räckvidd och livstid

2 b) Bodega bodegan = new Bodega(); double moms = 0.235; String namn = "Vargtass"; System.out.println(namn + " " + moms + bodegan.ändra(moms, namn); S

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

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

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

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

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

TENTAMEN OOP

DAT043 - Föreläsning 7

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

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

Objektorientering: Lagring och livstid

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Objektorienterad Programmering DAT043

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

TENTAMEN OOP

1 Egna klasser. 1.1 En punkt-klass

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

TENTAMEN OOP

TUTORIAL: KLASSER & OBJEKT

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

Objekt och referenser

Objekt och klasser - Introduktion

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

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

LÖSNINGSFÖRSLAG TENTAMEN

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

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

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

Tentamen. Lösningsförslag

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

Objektorienterad programmering

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Transkript:

Programmeringsteknik för S, 2004 Grupp IV Idag ska vi gå igenom Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Anteckningar i pdf format: http://www.nada.kth.se/ hjorth/teaching/ Klasser och instanser, hur hänger de samman och vad skiljer dem åt? Nyckelorden new, public, private, static och this, vad betyder de? Metodanrop och lokala kopior av variabler. Vikten av att skriva snygg kod. Vi ger ett exempel. Dagens övning innehåller ganska mycket, stryk under det du tycker är speciellt viktigt så går det snabbare att ögna igenom senare. Titta gärna igenom dessa anteckningar igen på tåget när du åker hem. Klasser och instanser Vad är en klass? Java är ett objektorienterat språk. Det betyder att data och metoder för att manipulera data har samlats ihop till objekt. En annan viktig fördel med objekt är att de låter oss abstrahera. Vi skiljer användningen av datastrukturer från den underliggande lagringen och implementeringen. Med objekt kan vi alltså dölja den underliggande strukturen; hur objektet representerar data internt och vilka algoritmer dess metoder använder. Efter att ett objekts kod är skriven är det bara intressant vilken illusion objektet presenterar för de andra programdelarna. Det vill säga, hur dess gränssnitt ser ut. Detta betyder att vi kan ändra hur objektet fungerar inuti utan att behöva ändra på hela programmet. Vad har klasser och instanser med detta att göra? En klass är vårt sätt att i programkoden beskriva hur objekten ska vara. public class Complex { private double real, img; // Konstruktorer, skapar en ny instans Complex() { real = 0; img = 0; Complex(double real) { this.real = real; img = 0; Complex(double real, double img) { this.real = real; this.img = img; // Metoder för att accessa realdel och imaginärdel public double getreal() { return real; public double getimg() { return img; Complex sum(complex a, Complex b) { this.real = a.getreal() + b.getreal(); this.img = a.getimg() + b.getimg(); return this; // Metod som omvandlar det komplexa talet till en sträng return real + "+" + img + "i";

Kort om public, private och this Vad är en instans? En variabel deklarerad i en metod existerar endast inom metodens måsvingar, den syns därför inte utifrån. När en ny instans skapas väljer java den konstruktor som bäst matchar parametrarna vi skickade. Metoder eller variabler deklarerade private är endast synliga inuti klassen. Däremot är metoder och variabler som är markerade public synbara utanför klassen. Nyckelordet this syftar på den instans vars instansmetod vi just nu befinner oss i. Det kan även användas för att nå klassvariabler och instansvariabler som dolts av lokala variabler, this.längd syftar då på klassvariabeln längd. Om klassen är gjutformen så är instansen tennsoldaten, vars utseende är beroende av hur vår klass är definerad i koden. Ur varje gjutform kan man skapa många liknande tennsoldater, på samma sätt kan man skapa många instanser av samma klass. Nya instanser av en klass skapas med hjälp av new, Complex x = new Complex(3,4); Detta kan ske i till exempel main, public class TestComplex { public static void main(string args[]) { Complex x = new Complex(3,4); Complex y = new Complex(5,6); Complex z = new Complex(); z.sum(x,y); System.out.println("Summan är: " + z.tostring()); Hur kommer static in i bilden? Skilj på klassobjekt och instansobjekt Både variabler och metoder kan deklareras med eller utan static. Allt som är static lagras i ett för alla klassens instanser gemensamt klassobjekt, medan instansvariabler lagras i de olika instansobjekten. Med andra ord: står det static framför finns det en gemensam kopia, står det inte static finns det en kopia för varje instans. I tennsoldatsanalogin har alla samma designer, som deklareras static, men de skiljer sig i färg, vilket vi sparar som en instansvariabel. public class TennSoldat { static String designer = "Olle"; TennSoldat(String färg) { this.färg = färg; Vi repeterar. Det finns bara ett klassobjekt, i vilken alla klassens static metoder och variabler ligger. Det kan finnas flera instansobjekt, var och en med sin egen kopia av instansvariablerna. Klassobjekt static String designer = "Olle"; static String getdesigner() { return designer; return designer + "-tennsoldaten är " + färg; skapas av en konstruktor som anropas med hjälp av new TennSoldat().

Av detta följer... Hur skickar vi parametrar? Staticmetoder kan bara använda sig av staticvariabler, medan instansmetoder kan använda både instansvariabler och staticvariabler. Anledning till detta är att en staticmetod inte kan veta vilken av de olika instanserna den ska titta i för att hitta rätt färg. Staticmetoder kan anropas utan att behöva skapa en instans först. public class TestTennSoldat { public static void main(string[] args) { TennSoldat s = new TennSoldat("Blå"); String d = TennSoldat.getDesigner(); // Anrop av static metod System.out.println("getDesigner() är static, retunerar " + d); System.out.println(s.toString()); Notera hur staticmetoden getdesigner() anropas i vår kod! Den är inte instansierad. När vi gör ett anrop till en metod med en variabel som argument är det alltid en kopia av den variabeln som skickas. public class MetodAnrop { public static void main(string[] inparametrar) { int x = 4, y = 7, summa; summa = sum(x, y); // sum anropas och x kopieras till a, y till b System.out.println(x + " + " + y + " = " + summa); public static int sum(int a, int b) { int s = a + b; a = 12; System.out.println("Lokala variabeln a = " + a); return s; Det betyder att ändrar vi på variabelns innehåll inuti metoden så påverkar det inte originalet utanför. >javac MetodAnrop.java >java MetodAnrop Lokala variabeln a = 12 4 + 7 = 11 Vi ser att a får värdet 12 i metoden sum men att x förblir lika med fyra i main-metoden. Likadant med referensvariabelanrop Ett exempel på referensanrop Tänk på att innehållet i en referensvariabel är just referensen som pekar på ett objekt. Om vi kopierar den pekar den fortfarande på samma objekt. Nu kommer det viktiga. När vi anropar en metod med ett objekt är det egentligen en referensvariabel pekande till objektet som vi skickar. Det tas alltså ingen ny kopia av objektet utan bara av referensvariabeln. Kopian på en referensvariabel pekar på samma objekt som original referensvariabeln! Vi kan alltså modifera original objektet inifrån metoden genom att arbeta med referensvariabler. public class Kaka { String typ; boolean kvar; Kaka(String typ) { this.typ = typ; kvar = true; if(kvar) { return typ + "skaka"; else { return "Kaka uppäten..."; void ätakaka() { System.out.println("Mums, mums... God " + typ + "skaka!"); kvar = false; som anropas ifrån main-metoden i följande klass public class StoraSyster { public static void main(string[] inparametrar) { Kaka k = new Kaka("morot"); Det är med andra ord samma regler som gäller vid funktionsanrop som vid tilldelning! System.out.println("Låna " + k + " till lillebror."); lånakakatilllillebror(k); System.out.println(k); Objekten kopieras inte, bara referenserna. public static void lånakakatilllillebror(kaka lillebrors) { lillebrors.ätakaka();

Lillebror äter upp kakan! Varför är detta viktigt? Ifall det har skapats en lokal kopia av vår Kaka skall lillebror kunna äta upp den lånade kakan utan att storasystern förlorar den. Vi kompilerar och kör vårt exempel. >javac StoraSyster.java >java StoraSyster Låna morotskaka till lillebror. Mums, mums... God morotskaka! Kaka uppäten.. Kakan är uppäten! Lillebror har följt referensen och hittat originalobjektet och ätit upp det. Vad lär vi oss av detta... Man kan inte lita på lillebror? Man kan inte äta kakan och ha den kvar? eller... Med referensvariabler kan vi enkelt manipulera våra orignalobjekt direkt! Anledningen till att inte kopior skickas är effektivitet. Det tar tid att göra kopior, minne måste läggas undan till objektet, konstruktorer köras och instansvariabler kopieras. Det är också trevligt att kunna manipulera objekten direkt inifrån metoder. Men varför måste vi ha koll på detta? Antag att vi av misstag ändrar på ett objekt inuti en metod i tron att det är en lokal kopia. Det kan vara mycket svårt att hitta sådana fel i ett stort program. Vi spar med andra ord tid. Nu lämnar vi klasser och instanser Variabelnamn och intendering Hur du skriver koden kan ibland vara lika viktigt som vad det är du skriver. Samma metod kan skrivas på många olika sätt, alla är inte lika bra. Snygg kod är lättare att förstå. Felsökning går snabbare. Lättare att upptäcka fel direkt, före kompilering! Vad ska vi då tänka på? Det är viktigt att metoder och variabler får namn som återspeglar deras funktion. Ostädad kod kan vara mycket svårläst. Ett skräckexempel, public class Obegriplig { private static int grrrrrrr, grrrrr = 0; public static void main(string[] a) { int grrrrrr = 4; for(int grrrr = 1, grrrrr = 1; grrrr <= grrrrrr; grrrr++) { grrrrr *= grrrr; System.out.println("4! = 1*2*3*4 = " + grrrrr); while(grrrrr < 27) System.out.println(""); grrrrr++; Kommer den här koden att kompilera? Vad händer när den körs? Beräknar den fyrfakultet rätt? Hur många gånger skriver programmet ut texten på vår skärm?

Oändlig loop! Om vi städar upp koden... >javac Obegriplig.java >java Obegriplig 4! = 1*2*3*4 = 0 ^C Vi får en oändlig loop... kan ni se varför? Några intenderingar och väl valda variabelnamn gör felsökningen lättare. public class Begriplig { private static int k, prod = 0; public static void main(string[] a) { int sista = 4; for(int i = 1, prod = 1; i <= sista; i++) { prod *= i; System.out.println("4! = 1*2*3*4 = " + prod); while(prod < 27) System.out.println(""); prod++;...ser vi felen. Kom ihåg! Den lokala variabeln prod döljer den privata klassvariabeln prod inuti for-loopen. Resultatet av uträkningen sparas i den lokala variabeln, men så snart vi lämnar for-loopen existerar den inte längre utan prod svarar då mot klassvariabeln prod som är initierad till noll. Detta leder till att fakulteten beräknas fel! Den oändliga loopen uppkommer därför att while-slingan saknar måsvingar, indenteringen avslöjar att prod++ ligger utanför loopen. Utelämnar man måsvingarna är det bara raden direkt efter while-loopen som upprepas. Eftersom loopenvariabeln inte ökar, kommer while-slingan aldrig att avslutas. Var försiktiga med loopvariabler. Se upp med synbarhet, lokala variabler döljer andra variabler med samma namn! Med andra ord, var aktsam då du återanvänder variablenamn. Måsvingar runt for- och while-loopar. Indentera din kod, dvs tryck på tab när du står på en rad i emacs. Observera att filens namn måste sluta på.java för att det ska fungera. Välj förklarande variabel och metodnamn. Det viktigaste idag var dock klasser och instanser. Skulle du kunna förklara hur de hänger ihop? Tänk på tennsoldaterna...