Hoppa till huvudinnehållet
Institutionen för informationsteknologi

Laboration 1

Syftet med den här laborationen är att du ska bekanta dig med Java samt programmeringsmiljön BlueJ. BlueJ är en utvecklingsmiljö för Java speciellt lämpad för undervisning på en grundkurs. BlueJ har utvecklats vid Monash University, i Melbourne, Australien. Mer om BlueJ finns att läsa på http://www.bluej.org/ och http://bluej.monash.edu/. Vi kommer att titta på hur BlueJ fungerar och hur man arbetar med det. Du kommer inte att behöva skriva några egna program -- det kommer på nästa laboration.

BlueJ är fritt att ladda ned och använda på egen dator (PC, Mac) i undervisningen, läs mer på http://www.bluej.org/

Du förväntas ha läst igenom laborationen innan laborationstillfället och tänkt igenom hur du ska lösa uppgifterna. Om du har glömt hur UNIX och Emacs fungerar så kan det vara en bra idé att repetera dessa moment från datorintroduktionen. Se också till att du känner till det lösenord du senast använde i hus 1, eftersom det är datorsalarna där vi använder. Har du glömt ditt lösenord, tala med DatorQ i god tid före laborationen.

Du bör också ha läst igenom kap 1.1 - 1.4 i Skansholm för att förstå de begrepp som används. I laborationen kommer du att testa de exempelprogram som finns i bokens kap 1.5 - 1.8, läs gärna dessa avsnitt under laborationens gång, så kan det vara lättare att förstå vad du gör.

Övningarna under denna lab är mycket enkla. Anledningen till detta är att du ska lära dig de praktiska handgreppen, så att du framöver inte behöver fundera på hur systemet fungerar utan i stället i framtiden kan koncentrera dig på programmeringsproblemen.

Uppgifterna ska lösas och redovisas individuellt. Muntligt samarbete är dock tillåtet och rekommenderas.

När du har avslutat den sista uppgiften, ber du din labassistent komma för att godkänna ditt arbete. Var beredd att visa det eller de program han begär. Om han är nöjd med dina lösningar, behöver du inte lämna in något.

Förberedelser

Innan du börjar med laborationen ska du göra följande inställningar. Dessa behöver bara göras en gång och inte för kommande laborationer.

  • Skapa en kurskatalog för kursen där du kan lägga alla filer som rör kursen (mkdir gp). Det kan vara bra att ha den i en huvudkurskatalog där du lägger samtliga dina kurser. Det är inte bra om huvudkatalogen blir för rörig.
  • Det finns färdiga program som vi kommer att använda oss av under kursen. Ställ dig i kurskatalogen (cd gp) och kopiera programfilerna dit (cp -r /it/kurs/prog1/public_html/qnvht04/BlueJ/examples .).

Uppgifter

Starta BlueJ från kurskatalogen du just har skapat med kommandet

> bluej & .

Tecknet & innebär att ditt Unix-fönster fortfarande är mottagligt för kommandon. Följande fönster dyker upp:

fig1.gif

Öppna ett projekt

I Project-menyn, klicka på Open Project och ett nytt fönster dyker upp. Sök i din kurskatalog efter examples och där skall det finnas ett antal kataloger (s.k. projekt). Välj att öppna projektet shapes.

fig2.gif

Följande visas när projektet shapes öppnas:

fig3.gif

Projektet består av fyra klasser och dessa visas i ett diagram (klassdiagrammet) som fyra färgade rektanglar, en för varje klass. Namnen på klasserna är Circle, Square, Triangle och Canvas. Pilarna i diagrammet anger hur klasserna relateras till varandra, streckade pilar betyder att klassen består av en annan klass och heldragna pilar betyder anger en arvsrelation.

Skapa objekt

Högerklicka på klassen Circle och välj new Circle() i popup-menyn. Nu efterfrågas "name of the instance". Klicka OK och låt den få defaultnamnet "circle1" (alt. kan du hitta på ett eget namn). Du har nu skapat ditt första objekt av klassen Circle. Man kan också säga att du skapat en instans av klassen Circle. Den röda rektangeln i nedre delen av fönstret visar att ett objekt skapats, vad det heter och vilken klass objektet skapats av. Objektfönstret längst ned är samlingsplatsen för alla skapade objekt.

fig4.gif

Skapa en annan cirkel på samma sätt, dvs skapa ytterligare en instans av klassen Circle. Kalla det nya objektet med ett namn, t ex Torsten. Skapa även några instanser av klassen Square.

Du har nu använt klasserna Circle och Square som mall och skapat flera Circle- och Square-objekt.

Anropa metoder

Högerklicka på en av Circle-objekten (inte klassen!). I popup-menyn finns flera operationer, s.k. metoder listade. Dessa används för att kommunicera med objekt och för att få objekten att utföra olika uppgifter i programmet.

fig5.gif

Prova, dvs klicka på metoden makeVisible som visar (ritar ut) objektet i ett separat fönster. Observera att de röda rektanglarna i objektfönstret bara visar att objekt är skapade, inte hur de ser ut. I det här exemplet kan man även rita upp själva objekten. Det visar sig att objektet circle1 är en liten blå cirkel som är placerad till vänster i fönstret.

fig6.gif

Prova att anropa moveRight och moveDown ett par gånger för att få objektet att hamna mer centrerat i fönstret. Prova också att anropar metoden makeInvisible två gånger. Gör cirkeln synlig igen genom att anropa lämplig metod.

Parametrar till metoderna

Anropa MoveHorizontal:

fig7_new.gif

Här förväntas att ett tal skall matas in. Prova med 50 och tryck OK. Prova med -50.

Raden void moveHorizontal(int distance) (i bilden ovan) kallas för metodens huvud och den anger hur man använder metoden. I parentesen ser man att metoden har en parameter. Parametern anger vilken information som kan skickas till ett objekt. Parametern har en datatyp int (förkortning för integer) och ett namn distance. Vi återkommer till datatyper under senare föreläsningar. Anropet ser ut som
circle1.moveHorizontal()
vilket betyder att metoden anropas för objektet med namnet circle1, dvs att det är objektet circle1 som skall flyttas horisontellt. Notera att det högst upp finns en kommentar i kursiv stil som anger vad metoden gör för något.

Anropa moveVertical, slowMoveVertical och changeSize för objektet circle1.

Gör ett av dina andra cirkelobjekt synligt. Flytta det 80 pixlar horisontellt. Hur ser metodanropet ut nu?
Även klassen Kvadrat har en moveHorizontal()-metod. Hur kan anropet att flytta en av dina kvadrater horisontellt se ut?

Skapa ett Triangel-objekt, se till att objektet ritas upp och anropa sedan metoden changeSize. Denna metod har två parametrar.

Om en metod saknar parameter är parentesen tom, vilket innebär en begränsning i möjligheten att kommunicera med hjälp av metoden.

Datatyper

Parametrar har alltid en datatyp som anger vilken sorts värde som parametern kan ha. Datatypen int betyder heltal. Metoden changeColor har en parameter av datatypen String. Det är en text (även kallad sträng eller textsträng) som skrivs mellan citationstecken exempelvis "red".

Anropa changeColor för ett av objekten. Testa några av de korrekta värdena för parametern (se metodens kommentar).

Vad händer om du anger ett felaktigt värde mellan citationstecknen? Vad händer om du ej skriver citationstecken, exempelvis red?

Multipla instanser av objekt

Man kan skapa hur många objekt, dvs instanser som helst av en klass. När objekten skapas (konstrueras) används en speciell typ av metod som kallas konstruktorer. De används bara vid skapandet av objekten, och de heter alltid likadant som klassen själv. Om du högerklickar på symbolen för klassen Circle ser du att det finns två metoder som är konstruktorer. De skapar objekten på olika sätt. Om du väljer new Circle() använder du en standardkonstruktor för att konstruera en standardcirkel, vilket i det här fallet alltid ger dig en blå osynlig cirkel, 30 pixlar i diameter, 20 pixlar in från vänstra kanten och 60 pixlar ned från övre kanten. Om du i stället själv vill bestämma hur cirkel-objektet skall se ut när det konstrueras skall du använda en överlagrad konstruktor. I klassen Circle finns en sådan. Den ger dig möjlighet att välja storlek och läge på det nya objektet. Det betyder att den har tre parametrar: diametern d, läget i x-led, xPos samt läget i y-led, yPos.

Skapa nu en stor cirkel som ligger ungefär i mitten av fönstret. Gör den synlig. Som du ser får du en blå cirkel.

Status för objekt

Ett objekts status bestäms av värdena för objektets alla instansvariabler. För ex.vis ett Cirkel-objekt är det instansvariablerna x-position, y-position, diameter, färg och synlighet som anger dess status. Man kan läsa av statusen för ett objekt genom att i popup-menyn välja Inspect. Fönstret Object Inspector visas då.

fig8.gif

Se till att du har flera objekt skapade och inspektera dem; högerklicka på objektets symbol i objektfönstret och välj Inspect. Stäng inte inspektionsfönstren. Försök att ändra statusen på ett objekt genom att anropa en metod (låt fönstret Object Inspector vara öppet när du anropar metoden). Notera att datatypen för alla instansvariabler finns angivna i Object Inspector.

Inspektera ett Cirkel-objekt och notera att där finns en ny datatyp förutom int och String - vilken?

Vad händer i datorns minne när ett objekt skapas?
Vad händer med objektet när man stänger programmet?
Vad händer med klassen när man stänger programmet?

Vad innehåller ett objekt

Objekt av samma klass har exakt lika många instansvariabler och exakt samma namn på instansvariablerna. Det enda som kan skilja är värdet på instansvariablerna, dvs statusen. Varje objekt har ett eget utrymme i datorns minne.

Objekt av olika klasser kan däremot ha olika innehåll vad beträffar antal instansvariabler och namn på dessa.

När ett objekt skapas (du valde exvis new Circle()) så erhåller objektet automatiskt alla de instansvariabler som är associerade med klassen och instansvariablerna får initiala värden.

Alla objekt i en klass har samma antal metoder, men metoderna används av objekten (ej klassen). När en metod anropas är det för ett specifikt objekt, t. ex. circle1.moveUp() eller torsten.moveUp(). Objekten använder metoderna för att utföra det programmet är tänkt att utföra.
Olika klasser har olika antal metoder som utför olika saker. Om du högerklickar på objekten ser du att Circle-, Square- och Triangle-objekten har olika antal metoder som kan göra olika saker.

Använd klasserna Triangle, Circle och Rectangle för att skapa och rita en bild som föreställer ett hus och sol ungefär som bilden nedan.

Vilka metoder använder du? Finns det olika sätt att lösa det? Kan du ge förslag på nya metoder i respektive klass som skulle lösa det effektivare? Vad skulle dessa metoder kunna heta och vilka skulle parametrarna vara?

fig9.gif

Interaktion mellan objekt (klassen Picture)

Stäng shapes-projektet och öppna projektet picture som innehåller klasserna Picture, Triangle, Circle och Canvas. De streckade pilarna i klassdiagrammet anger att Picture består av och därmed använder de klasser som pilarna pekar på. Denna relation mellan klasser betecknas med "Uses" i View-menyn, dvs Picture Uses Triangle, etc. Du kan välja om du vill se denna relation i klassdiagrammet eller inte genom View-menyn.

Skapa en instans (ett objekt) av klassen Picture och anropa metoden draw. Testa även metoderna setBlackandWhite och setColor. Hur tror du att klassen Picture skapar den bild som ritas upp?

Källkod

Till varje klass hör en källkod. Det är en text som i detalj definierar en klass. För att se källkoden, dubbelklicka på klassen (eller högerklicka på klassen och välj Open Editor).

Titta på källkoden i klassen Picture mha Open Editor. Källkoden visas nu i ett nytt fönster - en texteditor. Editorn är en ordbehandlare som är anpassad för programmering.

Källkoden är skriven i programmeringsspråket Java. Källkoden definierar instansvariablerna och metoderna i klassen, dvs klassens struktur och beteende.

Försök urskilja beståndsdelarna i klassen Picture's källkod: Instansvariablerna finns överst och metoderna längre ned.

Leta rätt på den del av källkoden i Picture som ritar ut bilden. Ändra denna del så att solen blir blå istället för gul.

Innan du kan prova din nya Picture-klass måste du se till att källkoden kontrolleras så att den är korrekt enligt Java-språket och dessutom - om källkoden var korrekt - översättas till s.k. maskinkod som datorn kan tolka. Dessa två steg kallas för kompilering.

I texteditorn klickar du på Compile för att kompilera. Om du får meddelandet Class compiled - no syntax errors innebär det att du allt gick bra och du kan nu prova din uppdaterade Picture-klass (gör det). Annnars meddelade kompilatorn att den upptäckt fel, grunna inte för mycket på det för tillfället, utan fråga gärna labledaren eller läraren om råd.

Ändra Picture-klassens källkod så att den simulerar en solnedgång, dvs solen skall sakta röra sig ned mot horisonten när bilden ritas upp. Tips - använd metoden slowMoveVertical och ändra i metoden draw. Kom ihåg att kompilera innan du testar

Ändra källkoden så att det skapas två solar. Tips - leta rätt på de fyra attributen wall, window, roof och sun. Lägg till en rad som skapar den andra solen i källkoden. Granska sedan de metoder där den första solen används. Lägg till nya rader i metoderna så att även den andra solen hanteras.

Begrepp

Förklara med egna ord begreppen:

  • Objekt
  • Klass
  • Instans
  • Instansvariabel
  • Metod
  • Parameter
  • Källkod
  • Kompilering
  • Editor

Uppdaterad  2006-03-16 14:04:03 av Anders Berglund.