TDDE10 TDDE11, 725G90/1 Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Introduktion OOP Instanser, instansvariabler, instansmetoder Konstruktorer klassmetoder, klassvariabler Synlighet 1
Hello World! I Java använder vi klasser för nästan allt! class Human { int age; void sayhello() { System.out.println( Hello world!"); public static void main(string[] args) { Human david = new Human(); david.age = 20; david.sayhello(); Vi skapar ett objekt av klassen human 2
Objektorienterad programmering Objekt som skapar andra objekt Objekt som interagerar med andra objekt Vem skapar det första objektet då? 3
Introduktion till OOP(1) Fallstudie: Boll Slutsatser: Attribut (en. field) Information/egenskaper Metoder (en. method) Vad den kan göra, Operationer 4
Introduktion till OOP(2) Fallstudie: DVD-spelare Slutsatser: Attribut (en. field) Information/egenskaper Metoder (en. method) Vad den kan göra Objekt kapslar in sin implementation, visar upp ett gränssnitt 5
Introduktion till OOP(3) Fallstudie: DVD-spelare + TV Visa upp den här filmen! Slutsatser: Attribut (en. field) Information/egenskaper Metoder (en. method) Vad den kan göra Objekt kapslar in sin implementation, visar upp ett gränssnitt Objekt samarbetar! 6
Introduktion till OOP(4) Fallstudie: Kia Cee d SW många objekt Slutsatser: Objekt kan vara lika varandra, men är ändå inte samma objekt Objekt som verkar vara likadana hör ändå ihop på något sätt.. 7
Objekt Faktiska instanser av klasser. class KiaCeedSW{ INST ANS Color color; VAR IABL ER int modelyear; String licenseplate; boolean isbeingrepaired;... boolean candrive() { if (isbeingrepaired) { SN return false; A T INS OD T E else { M return true; Klass Beskrivs av Instansierar Objekt 8
Objekt (2) Instansvariabler deklareras i klassen (utanför metoder). Jämför med lokala variabler, parametrar. Klass Varje objekt får sina egna instansvariabler. Beskrivs av Instansmetoder kan använda sitt objekts instansvariabler. Instansierar Objekt 9
Hitta felet! public class Human { int age; public void printage() { int unusedvar; System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa; lisa.printage(); KRASH! Ett objekt måste instansieras innan det kan användas. 10
Hitta felet! public class Human { int age; = 27; Nu kommer alla Humans vi skapar ha age 27... På På skärmen: skärmen: Jag årår public void printage() { Jag är är 027 gammal gammal int unusedvar; System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa = new Human(); lisa.age = 27; Instansvariabler måste lisa.printage(); tilldelas ett värde innan de används. 11
Konstruktorer Är en metod som används för att initiera ett objekt Körs när man kör new... Klasser kan ha flera olika konstruktorer Klasser kan helt sakna konstruktorer (En tom defaultkonstruktor skapas av kompilatorn) public class Human { int age; Defaultkonstruktorn: // Detta är konstruktorn public Human() { public Human(int startingage) { age = startingage; public void printage() { System.out.println("Jag är " + age + " år gammal"); Vi skapar ett public static void main(string[] args) { objekt av klassen Human lisa = new Human(27); human lisa.printage(); genom att anropa konstruktorn. 12
Konstruktorer (exempel) public class Movie { int year; String title; double rating; Vi kan kalla parametrarna för samma sak Men hur kommer vi då åt instansens variabler? public Movie(int year, String title, double rating) { this.year = year; this.title = title; this. rating = rating; Vid instansiering (I t.ex. main): Vid instansiering (med konstruktor): Movie m = new Movie() m.year = 1999; m.title = The Matrix ; m.rating = 10.0; Movie favomovie = new Movie(1999, The Matrix, 10.0); 13
Statiska metoder och variabler public class KiaCeedSW{ Color color; int modelyear; String licenseplate; KiaCeedSw mykia = new KiaCeedSW(Gray, 2010, KPY038 ); KiaCeedSw gulliskia = new KiaCeedSW(Red, 2011, RJU552 ); static String manufacturer = Kia Motors ; static double rating = 7.2; public KiaCeedSW(. // Konstruktorn KiaCeedSw tjskia = new KiaCeedSW( Black, 2012, FFS123 ); Vissa egenskaper hör snarare till Klassen, (d.v.s ritningen, konceptet eller beskrivningen ) snarare än de enskilda instanserna (objekten). I java beskrivs sådana egenskaper med static. Ex: bilens tillverkare skulle kunna representeras. Det hör inte till någon specifik instans, och är samma för alla. Eller t.ex Top Gears betyg för just denna bilmodell. 14
Statiska metoder och variabler (2) public class KiaCeedSW{ Color color; int modelyear; String licenseplate; static String manufacturer = Kia Motors ; static double rating = 7.2; public KiaCeedSW(. // Konstruktorn Detta påverkar också hur vi tänker oss att vi kommer åt dessa data. mykia.color tjskia.licensplate Instansvariabler (vi behöver en instans för att komma åt dem) KiaCeedSW.manufacturer KiaCeedSW.rating Klassvariabler (static) (vi behöver inte en instans för att komma åt dem) 15
Statiska metoder och variabler (3) public class KiaCeedSW{ Color color; int modelyear; String licenseplate; static String manufacturer = Kia Motors ; static double rating = 7.2; public KiaCeedSW(. // Konstruktorn Från en instans kan man komma åt klassvariabler: mykia.manufacturer Detta är ju rimligt, men kanske inte så tydligt. 16
Statiska metoder och variabler (4) public class KiaCeedSW{ public void drive() { public static void givenewrating(double d) { public void setcolor(color newcolor) { public static void printmanufacturer() { Vi kan göra samma uppdelning för metoder. mykia.drive() KiaCeedSW.giveNewRating(8.75) mykia.setcolor(gold) KiaCeedSW.printManufacturer() Instansmetoder (vi behöver en instans för att komma åt dem) Klassmetod (static) (vi behöver inte en instans för att komma åt dem) 17
Statiska metoder och variabler (5) Hitta felet! public class Human { int age = 0; static int sum(int a, int b) { return a + b; static void increaseage(int addition) { age = age + addition; public static void main(string[] args) { int x = Human.sum(1, 9); Human lisa = new Human(); lisa.increaseage(1); Statiska metoder kommer inte åt instansvariabler. 18
Statiska metoder och variabler (6) Instansmetoder kommer åt både klass- och static instansvariabler Klassmetoder kommer endast åt klassvariabler En instansvariabel hör till en specifik instans En klassvariabel delas mellan alla instanser Dessutom: Man behöver (bör) inte gå via en instans för att komma åt en klassmetod/klassvariabel Klassmetoder Klassvariabler Klass Beskrivs av Instantierar Objekt Instansmetoder Instansvariabler 19
Statiska metoder och variabler (7) Testa dig själv. Vad skulle vara static för t.ex. klassen Date som representerar ett datum? Variabel/Metod Beskrivning day, month, year Heltal för att representera datumet. nej nextdate() Metod som returnerar nästa dag. nej firstdate() Metod som returnerar första datumet som går att representera. static daysinaugust Heltal som håller reda på hur många dagar det är i augusti månad. static (och final) isbefore(date d1, Date d2) Metod som returnerar sant om d1 är före d2. static formatoptions Data som beskriver utskriftsformat static?? 20
Synlighet Ex. En videobutik. 21
Synlighet (2) Vi blandar in lite fler klasser... class ChessPiece { int posx; Point pos; int posy; String name; class ChessBoard { void setup() { ChessPiece pawn = pawn.posx = 1; R pawn.posy = 2;RRO E... class ChessGame { void play() { pawn.posy++... OR R ER y x Det finns en klass Point, för att representera punkter I planet! class ChessRules { boolean ischeckmate() { if (king.posy ==...... OR R ER 22
Synlighet (3) x Eller ännu värre... class ChessPiece { int posx; int posy; String name; fixar till... class ChessBoard { void setup() { ChessPiece pawn = pawn.posx = 1; pawn.posy = 2;BUG... class ChessGame { void play() { pawn.posy++... G BU y y x Kanske mer effektivt att ha koordinatsystemet på ett annat sätt? class ChessRules { boolean ischeckmate() { if (king.posy ==...... G BU 23
(En parentes) Varför skall vi hålla på att ändra koden? Verkar ju bara bli problem Koden behöver effektiviseras. Nya krav har kommit från kund. Yttre omständigheter påtvingar att koden renoveras. Koden kanske inte var rätt från början... 24så Designa programmet att ändringar blir så smärtfria som möjligt.
Synlighet (3) Varför blir det så här? Och hur borde man göra då? class ChessPiece { private int posx; private int posy; String name; class ChessBoard { void setup() { ChessPiece pawn ChessPiece pawn = = pawn.x = 1; new ChessPiece(1, 2); pawn.y = 2;... B E F R Ö R O F E class R ChessGame { Å N void G D play() { A E N pawn.y++ pawn.increasey(1);... y x class ChessRules { boolean ischeckmate() { if (king.y ==... (king.ispositioned()...... 25
Synlighet (4) Dölj implementationen, visa upp ett gränssnitt. Tumregel: Visa upp så lite som möjligt Javas synlighetsmodifierare: public synlig för alla protected - synlig inom paketet och subklasser [inget] (package private) synlig inom paketet private - endast synlig inom klassen 26
Synlighet (5) Dölj implementationen, visa upp ett gränssnitt. Eftersom vi nu kapslar in data är det mycket viktigt att rätt klass ansvarar för sin funktionalitet. Gör man inte detta får man otrevliga beroenden. 27
Synlighet(6) Dölj implementationen, visa upp ett gränssnitt. Riktlinjer: Klasser som regel public En del klasser som endast ska användas internt kan ha minskad synlighet Interna hjälpmetoder private Övriga metoder public Attribut - private Möjligtvis protected om motiverat 28
Synlighet(7) Exempel: god programmeringssed public class KiaCeedSW { private String licenseplate; public void setplate(string newplate) { licenseplate = newplate; public String getplate() { Använd getters och return licenseplate; setters för att komma åt medlemsvariabler 29 utanför klassen.