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

Relevanta dokument
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 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

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

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

Övningar Dag 2 En första klass

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.

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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

TUTORIAL: KLASSER & OBJEKT

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

Java, klasser, objekt (Skansholm: Kapitel 2)

JAVA Mer om klasser och objektorientering

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

Föreläsning 3-4 Innehåll

Objekt och referenser

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Klasser och objekt i C#

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

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

Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Inledande programmering med C# (1DV402) Tärningarna ska kastas

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

Att bekanta dig med NetBeans programmeringsmiljö och skriva några enkla program med programmeringsspråket Java.

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

Objektorienterad programmering i Java

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.

1 Egna klasser. 1.1 En punkt-klass

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

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

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

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

Malmö högskola 2008/2009 CTS

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

OOP Objekt-orienterad programmering

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

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Metoder. Inledande programmering med C# (1DV402)

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

JAVAUTVECKLING LEKTION 11

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

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

Klasser och objekt. Henrik Johansson. August 20, 2008

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Introduktion till arv

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

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

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

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

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Föreläsning 13 Innehåll

Laboration 1 - Grunderna för OOP i Java

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

Klasshierarkier - repetition

Objekt och klasser - Introduktion

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

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

Tentamen, Algoritmer och datastrukturer

Lab5 för prgmedcl04 Grafik

LÖSNINGSFÖRSLAG TENTAMEN

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 programmering i Java I

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

Objektorienterad programmering Föreläsning 5

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

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

Modeller, Objekt och Klasser

Tentamen OOP

Objektorienterad programmering

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Grundläggande programmering DVG A08 & ISG A04. Allmän information. Å vem är jag då. Karlstads Universitet, Johan Öfverberg 1

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 )

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

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

Objektorienterad Programmering (TDDC77)

Parameteröverföring. Exempel. Exempel. Metodkropp

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

Objektorientering: Lagring och livstid

Objektorienterad programmering i Java

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

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

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

Tentamen i Programmeringsteknik I

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

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

Enkla variabler kontra referensvariabel

TENTAMEN OOP

Design av en klass BankAccount som representerar ett bankkonto

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

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

Laboration 1: Figurer i hierarki

Statistik över heltal

Föreläsning REPETITION & EXTENTA

Klasshierarkier. Klasser kan byggas på redan definierade klasser

OOP Objekt-orienterad programmering

Transkript:

Att skapa en klass kvadrat Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här: public class Kvadrat { private int sida; Det var väl inte så svårt? Eller var det det? Det finns en del att förklara här och jag skall göra ett försök att reda ut det mesta. Jag börjar med att förklara rad för rad för att sedan gå in på vad programmet gör och hur det används. Redan på första raden finns det en hel del att kommentera. På raden står det ju public class Kvadrat { och det kräver lite förklaring. Om vi börjar med public så är det en åtkomstmodifierare. Det finns några olika sådana och här kommer en beskrivning av 2 stycken. 1. Public, betyder att alla kommer åt att använda den. Det räcker med att ha tillgång (veta var det finns) till det som är public så är det ok att använda. 2. Private, betyder att ingen utomstående kommer åt den. Om det, som i detta fallet, är en klass som är private så blir det ju svårt att använda den, ingen har ju rätt att använda den. Nästa ord är det reserverade ordet class. class talar om att det är en klass som vi håller på att definiera. Vi kan i en fil definiera olika saker men vi skall, åtminstone i början av kursen, uteslutande skriva klasser. Sedan står det Kvadrat, det är något som jag hittat på alldeles själv. Det är namnet jag valt på min klass. Namnen på klassen (alltså Kvadrat i detta fallet) skall alltid skrivas med versal som första bokstav, då det är en standard att skriva så. Programmet kanske fungerar med gemen förstabokstav men det blir då bannor från mig Programmet, i sin helhet, skall ligga i en fil som heter samma sak som klassen med extensionen java. Filen som denna kod skall ligga i skall/måste alltså heta Kvadrat.java. Sist på raden är det en liten lustig krumelur ({), jag kallar den för startmåsvinge. Den talar om att själva definitionen av klassen börjar här. Denna startmåsvinge hör ihop med den slutmåsvinge som finns på sista raden i programmet (). Då hoppas jag att första raden är klar. Nästa rad är ju ganska kort men kräver lite förklaring den också. private int sida; beskriver klassens attribut eller egenskap, även kallad instansvariabel. Vad som kännetecknar en kvadrat är ju, i alla fall i min värld, att den har en sida 1(5)

(fyra för att vara noga men alla är ju lika långa). Det har jag beskrivit här. Jag har sagt att sidan är private, dvs ingen utanför kan ändra eller läsa av värdet. När det gäller attribut (egenskaper) så är den väldigt vanligt att man sätter dem till private, detta för att få kontroll på vem som ändrar eller läser av värdet. int är ett reserverat ord som betyder att mitt attribut är av typen heltal. Eftersom jag sagt att sida skall vara av typen int så kan jag bara tilldela sidan heltal. Men, innan vi går vidare måste vi ta och fundera över en sak. Jag har ju i texten ovan pratat om åtkomstmodifierare. Jag skrev att om man använder modifieraren private så kommer ingen utomstående åt det jag skyddat. Om vi tittar på attributet sida så har jag ju satt det till private. Utomstående i detta fallet är ju då allt som är definierat utanför klassen Kvadrat. Om du som användare skulle vilja läsa av sidan eller om du skulle vilja sätta den till 4 så kan du inte det, du är ju inte en del av Kvadrat! Detta kan man lösa med att göra sida till public men det skall vi INTE! Det blir lite mer arbete i början men vi vinner, tror jag, i längden på att lära oss rätt från början. Svaret är alltså inte att göra sida åtkomlig för allt och alla utan att definiera vägar in och ut. Jag har just sagt att attributet sida skall vara privat. För att kunna komma åt det så skapar jag metoder som är publika. Dessa är då en del av klassen vilket gör att de har tillgång till det privata attributet samtidigt som jag deklarerar dem public, detta gör att jag som användare kommer åt dem utifrån. Jag skapar helt enkelt två metoder, en för att tilldela attributet ett värde (setsida) och en för att fråga efter värdet (getsida). Namnen på metoderna har jag själv valt men jag har följt en standard och döpt dem efter vad de gör. getsida för att hämta värde och setsida för att tilldela (sätta) ett värde. Om vi tittar lite på metoderna så ser den översta ut så här: Om vi som förut förklarar den rad för rad så betyder första raden att: - Den är public. Alla med, i detta fallet, en referens till ett objekt av typen Kvadrat har tillgång till objektets metod setsida. - void. Metoden returnerar inget. Returtypen void betyder att inget returneras. - setsida är det namnet jag valt till metoden. - (int sidain) är metodens parameterlista. I detta fallet tar vi emot ett heltal (int) som vi kallar för sidain. Jag har alltså hittat på detta namnet själv. - { talar om att definitionen av metoden börjar här. Denna definition avslutas med på rad tre. Själva innehållet, vad metoden gör, är inte så mycket att orda om tror jag. När vi anropar metoden skickar vi med ett heltal som vi kallar sidain. Här i metoden sätter vi objektets attribut (sida) till det värde som vi skickat in (sidain). Nästa metod är nästan lika, fast tvärt om. Här är det en metod som är skriven för att tala om vilket värde attributet sida har: 2(5)

Första raden, första ordet (public) kan vi väl vid det här laget. Nästa ord, int, talar om att metoden returnerar ett heltal av typen int. Efter namnet (getsida, som jag själv hittat på) är det tomma parenteser, det visar att getsida är en metod men den tar inte emot något värde. Sedan gör metoden inte mer än att den returnerar värdet på objektets attribut (sida). Detta skulle alltså vara hela klassen. Vi har nu byggt en klass som skall representera en kvadrat. Men hur skall vi använda den då? För att göra det riktigt generellt från början så skapar vi en egen klass för att köra/använda vår Kvadrat-klass. Det enda som behövs är att vi lägger de båda klasserna i samma katalog. I Eclipse innebär det att de skall ligga i samma projekt. Jag skapar alltså ytterligare en klass, denna klass skall alltså använda vår redan kapade Kvadrat-klass. Här kommer klassen: public class Rune { public static void main(string[] args) { Kvadrat k=new Kvadrat(); k.setsida(5); Denna klass skall alltså ligga i en fil som ni döper till t.ex. Rune.java. Namnet har jag själv hittat på och det speglar bara att vi skall använda klassen till att köra (run) någon annan klass. Det enda vi skall lägga i denna klassen är en main-metod, det är en sådan metod som krävs i alla javaprogram för att starta dem. Main-metoden måste se ut som i exemplet ovan (public static void main(string[] args)) för att kompilatorn skall känna igen den. Public vet ni redan vad det betyder, static betyder att metoden är knuten till klassen och inte till ett enskilt objekt. Detta gör att vi kan köra metoden utan att vi skapat något objekt först, men mer om static längre fram i kursen. void betyder, som jag sagt tidigare, att metoden inte skall returnera något värde. main är namnet på metoden, det har inte jag hittat på utan det är ett reserverat ord i Java, det måste finnas minst en mainmetod i alla javaprogram. Innanför parenteserna har vi parametrarna som vi skickar med till metoden, i detta fall skickar vi en vektor av strängar som vi kallar args. Vektorer kommer vi att gå igenom längre fram i kursen. Väl i main-metoden så är det alltså tre satser som skall göras. Den första är Kvadrat k=new Kvadrat(); Och innebär att vi skapar ett Kvadrat-objekt och håller reda på detta objekt med referensen k. Man kan skriva detta på följande vis också, då är det lättare att förklara steg för steg vad som händer: Kvadrat k; k=new Kvadrat(); 3(5)

På första raden skapar jag en referens av typen Kvadrat. Det är alltså en referens som är specialgjord för att referera till objekt av typen Kvadrat. Jag döper min referens till k. På andra raden skapar jag, med hjälp av operatorn new, ett kvadratobjekt. När det är gjort så tilldelar jag (tecknet =) min referens det skapade objektet. Jag har nu en referens som jag döpt till k och som håller reda på ett objekt av typen Kvadrat. Nästa sats i main-metoden är k.setsida(5);. Här använder jag min referens för att vi den komma åt metoden setsida i objektet. Jag skickar med värdet 5, som i objektet sedan tilldelas kvadratens attribut (sida). I sista satsen skriver jag ut värdet på sida. Detta kan jag inte göra i main-metoden så jag går via min referens och metoden getsida. Den metoden är ju public (precis som setsida ovan) vilket gör att jag kan komma åt den via min referens i main-metoden. Ni kan nu provköra programmet (de två klasserna) och se så att det fungerar som ni tänkt. Konstruktorer I kapitel 6.1 går författaren igenom konstruktorer. Här kommer min lite korta genomgång av konstruktorer. Konstruktorn är som vilken metod som helst, fast helt annorlunda Här följer i punktform några egenskaper som konstruktorer har, jämfört med andra metoder: - En konstruktor har ALLTID samma namn som klassen. Eftersom jag sagt att klassen skall ha en inledande versal så har alltså en konstruktor ett namn som inleds med en versal. Om ni följer kodstandarden så kommer en konstruktor att vara den enda metoden som har en inledande versal. - En konstruktor har inget returvärde. Det finns andra metoder som saknar returvärde, alltså att de inte skall returnera något, men då visar vi det genom att returnera void. En konstruktor returnerar inget, inte ens void. - En konstruktor körs alltid automatiskt och först när en klass skapas. I klassen Rune ovan ser ni ett konstruktoranrop (k=new Kvadrat();). Konstruktorn körs alltså när klassen skapas. - Det finns alltid en konstruktor i alla klasser, även i klassen Kvadrat här ovan. Om vi inte gör en egen så finns det alltid en defaultkonstruktor som används. - Man kan ha flera konstruktorer i en klass, då måste de ha unika signaturer. En signatur är namn och parameterlista tillsammans. Jag skall här göra en konstruktorer som visar hur det fungerar. Till vår kvadratklass skulle vi kunna ha följande konstruktor: public Kvadrat(int s){ sida=s; 4(5)

Vad händer om ni testar att lägga till denna konstruktor till klassen Kvadrat? Testa och läs vidare sedan. Det gick inte så bra va? Om ni kör Eclipse så ser ni att det blir ett rött streck under new Kvadrat() i Rune-klassen. Om ni fortsätter ändå så blir resultatet: Exception in thread "main" java.lang.error: Unresolved compilation problem: The constructor Kvadrat() is undefined at Rune.main(Kvadrat.java:16) Vad är det som hänt? Jo, ni har lagt till en egen konstruktor som tar en parameter (int s) men anropar konstruktorn utan några parametrar. Ni måste alltså ändra i anropet så att ni skickar med ett heltal när ni skall skapa klassen. På nästa sida ser ni hur det skulle kunna se ut när ni ändrat. Testa gärna andra alternativ och diskutera era resultat i First Class Fungerande program med en egendefinierad konstruktor: public class Kvadrat { private int sida; public Kvadrat(int s){ sida=s; public class Rune { public static void main(string[] args) { Kvadrat k=new Kvadrat(6); k.setsida(5); Diskutera gärna i First Class, det är när man försöker formulera problemen som man kan lösa dem. Det är också bra med andras åsikter då man kan göra rätt på olika sätt. 5(5)