ObjektOrienterad analys och design. SVP Vt2009 Föreläsning nr 2, måndag 8 april kl Diskussion (kurshemsida): Om designuppgiften Om projektuppgiften Om java (exempel, ”Summeringar”): Att arbeta med klasser, objekt, metoder och tillstånd i BlueJ Statiska variabler och metoder och objekt Om objektdiagram och anropskedjor Om ärvning, Collection, referens(variabl)er, likhet mellan objekt
ObjektOrienterad analys och design. SVP Vt2009 Föreläsning nr 2, måndag 8 april kl Att arbeta med klasser, objekt, metoder och tillstånd i BlueJ (starthjälp) –Laddning av existerande projekt –Kompilering av klasser –Skapande av objekt –Anropa metoder –Inspektera tillstånd
ObjektOrienterad analys och design. SVP Vt2009 Klasser: manifesterar sig dels statiskt som kodrader, javatext, i programlistor, dels dynamiskt som kompilerad bytekod och datastrukturer i det exekverande systemet, ”datorn”. Objekt: manifesterar sig dynamiskt som datastrukturer i det exekverande systemet, ”datorn”. Objekten skapas under exekveringen, utförandet av programmet. Metoder: finns framför allt som instans- eller objektmetoder, som man ber ett specifikt objekt om att utföra, men också i form av klassmetoder, dvs tjänster som man ber en klass att utföra.
ObjektOrienterad analys och design. SVP Vt2009 Attribut: egenskaper som objekt (och klasser) kan ha. Vilka attribut som finns definieras i klassen. Vad de attribut, som hör till objekt, har för initialvärden definieras när objektet skapas av klassens konstruktor, och värden uppdateras sedan av respektive objekt. Tillstånd: Ett objekts tillstånd i ett visst ögonblick utgörs av de värden objektets attribut har just då.
ObjektOrienterad analys och design. SVP Vt2009 Demo av shapes Chapter01/projects/shapes Prova själv Lek med de olika klasserna, objekten och metoderna!
ObjektOrienterad analys och design. SVP Vt2009 Välj: projects\chapter01\shapes Högerklicka på någon av klasserna, t.ex. Circle och välj: new Circle( ) Den får default-namnet circle1 och det dyker upp en symbol i ”objektdelen”.
ObjektOrienterad analys och design. SVP Vt2009 Skapa ett objekt till, förslagsvis ur klassen Square Nu har du två objekt och kan anropa deras metoder. Högerklicka på objekten och be dem bli synliga, välj att beställa tjänsten makeVisible( ) Vips dyker det automatiskt upp ett canvasobjekt, och i det manifesterar sig de två objekten vi skapat.
ObjektOrienterad analys och design. SVP Vt2009 Skapa fler objekt och lek med dem! Anropa de olika metoderna och se vad som händer. En del syns direkt, men du kan också högerklicka på objekten och välja Inspect. Då visas status, de aktuella egenskaperna. Tänk dig Inspect som ett "service- instrument" som ingår just i BlueJ. Det är inget man normalt kan göra med java-objekt. Värdena i Inspect-rutan uppdateras dynamiskt.
ObjektOrienterad analys och design. SVP Vt2009 Högerklickar du på en klass (t ex Circle) och väljer Inspect, ser du att denna klass inte har mycket till eget tillstånd. Koden är sådan att den här klassen helt enkelt inte har några attribut. Väljer du Canvas får du lite i alla fall:
ObjektOrienterad analys och design. SVP Vt2009 Attributen definieras i klassen med angiven datatyp och de får sedan värden, som hanteras av och hör till de enskilda objekten (utom de attribut, som är klassvariabler).
ObjektOrienterad analys och design. SVP Vt2009 Demonstration av klassvariabel och klassmetod, nyckelordet static. I projektet shapesStatic vill vi hålla reda på hur många objekt som skapats av de olika formerna, och vi gör det med en heltalsvaiabel numberOfInstances enligt: public class Circle { private int diameter; //--- private static int numberOfInstances = 0; /** Create a new circle at default position */ with default color. public Circle() { diameter = 30; //--- numberOfInstances = numberOfInstances + 1; } // ---- public static int getNumberOfInstances( ) { return numberOfInstances; } } Nyckelordet static gör att heltalsvariabeln numberOfInstances bara finns i ett exemplar som hör till klassen och inte till varje enskilt objekt. Metoden getNumberOfInstances( ) är också static och anropas via klassnamnet: Circle.getNumberOfInstances( ) I BlueJ anropas klassmetoder via högerklick på klassen Circle.
ObjektOrienterad analys och design. SVP Vt2009 Vi försöker nu mjölka ut ytterligare en sak ur projektet shapes: Ärvning I klasserna Circle, Square och Triangle fanns väldigt mycket som var gemensamt, nämligen variablerna: int xPosition; int yPosition; String color; boolean isVisible; och metoderna: public void makeVisible ( ) ; public void makeInvisible ( ) ; public void moveRight ( ) ; public void moveLeft ( ) ; public void moveUp ( ) ; public void moveDown ( ) ; public void moveHorizontal(int distance) public void moveVertical(int distance) public void slowMoveHorizontal(int distance) public void slowMoveVertical(int distance) public void changeColor(String newColor) private void erase ( ) ; Vi kan lägga detta i en gemansam klass Shapes, och i de ursprungliga klasserna Circle, Square och Triangle bara ha kvar det som är specifikt just för den aktuella klassen.
ObjektOrienterad analys och design. SVP Vt2009 Det som skiljer när det gäller variabler (fields) är att cirkelobjekt har diameter, kvadrater size (=sida) och trianglar width och height, och när det gäller metoder att rita dem med: public void draw( ); // olika biblioteksfunktioner används och anger storlek: public void changeSize(int newDiameter); // circle, one parameter public void changeSize(int newSize); // square, one parameter public void changeSize(int newHeight, int newWidth); // triangle, two parameters Genom att lägga det gemensamma i en superklass Shape kan man minska den totala kodmängden och framför allt göra den lättare att underhålla. Lite extra trixande krävs för att hantera det olika antalet parametrar till changeSize. Se projektet shapesPlus. Notera nyckelordet abstract på tre ställen i superklassen Shape, och extends Shape i de tre subklasserna Circle, Square och Triangle. Subklasserna känner till sin superklass, men superklassen vet inte vilka klasser, som hjälper till genom att bidra med de två abstrakta metoderna som saknas. shapesPlus
ObjektOrienterad analys och design. SVP Vt2009 Mer om ärvning: I shapesPlus -projektet var superklassen Shape abstrakt. Det betyder att den inte på egen hand kan skapa objekt. Man kan inte anropa konstruktorn i en abstrakt klass, utan der är då subklassernas konstruktorer som får anropas, när man vill ha ett objekt. Så är det inte alltid när man har ärvning. Man kan ha superklasser som inte är abstrakta. Peojektet shapesPlus är ett exempel där man har en begreppshierarki. Det generella begreppet är Shape, och man har tre olika specialseringar, eller om man så vill, utvidgningar av det. Att class Circle extends Shape betyder att objekt från Circle kan utföra alla de metoder som finns i superklassen Shape, och dessutom de metoder som finns i klassen själv. Skulle en metod vara implementerad med samma namn och samma formella parameterlista på båda i både super- och subklass gäller den dynamiska typen vilket betyder att det är den klass som anropades, när objektet skapades, som tillför den metod som tillämpas. Mer om detta i kursbokens kapitel 9.
ObjektOrienterad analys och design. SVP Vt2009 Ännu mer om ärvning: Ärvning används inte bara för hantering av hierakiska begreppsstruk- turer. Det allra vanligaste är nog när man vill utnyttja funtionalitet som finns hos någon av klasserna i javabiblioteken. Om man t.ex. vill göra ett adressregister med ett windowsliknande användargänssnitt, kan man utnyttja klassen JFrame i biblioteket javax.swing: import javax.swing.*; public class AdressRegister extends JFrame { // etc. Detta betyder att när man skapar objekt från klassen AdressRegister kan dessa objekt dels utföra all metoder som objekt från klassen JFrame kan utföra, dels alla de metoder man lagt in just i klassen AdressRegister. Raden import javax.swing.*; gör att alla klasser i biblioteket javax.swing blir ”synliga”, dvs kan refereras och användas, i klassen AdressRegister. Läs om ärvning i kapitel 8-9 i kursboken.