TDDE10 TDDE11, 725G90 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 Inkapsling/Synlighet 1
Hello World! with use... procedure Hej is begin Put( Hello World! ); end Hej; class MyProgram { public static void main(string[] args) { System.out.println( Hello world!"); Men vi behöver ändå en klass! 2
Objektorienterad programmering Fokus: Att modellera/representera, ansvar... 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
Hello World! Vi tänker om, och försöker tänka i objekt class Human { int age; class MyProgram { public static void main(string[] args) { System.out.println( Hello world!"); Vi skapar ett void sayhello() { objekt av klassen System.out.println( Hello world! I'm " + age +. ); human. (en instans). public static void main(string[] args) { Human david ; = new Human(); david.age = 20; david.sayhello(); Nu lägger vi över ansvaret för hur det skall hejjas på människan. Objekt utanför behöver inte bry sig om hur detta går till! ABSTRAKTION 5
6
Abstraktion (igen) När vi väl har vår abstraktion, så blir det lätt att använda den! class VeryFunGame { public static void main(string[] args) { Die die1 = new Die(); die1.roll(); Exakt hur detta går till får klassen Die ansvara för skönt! System.out.println( Du slog " + die1.result); 7
Introduktion till OOP(2) 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... 8
Objekt Faktiska instanser av klasser. Jmf. typer och värden/variabler. 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 9
public static void main(string[] args) { KiaCeedSW mycar = new KiaCeedSw(); mycar.year = 2010; Faktiska instanser av klasser. mycar.isbeingrepaired = false; if (mycar.candrive()) { System.out.prinln( Vroom! ); class KiaCeedSW{ Color color; Objekt (2) int year; String licenseplate; boolean isbeingrepaired;... boolean candrive() { if (isbeingrepaired) { return false; else { return true; Klass KiaCeedSW bengans = new KiaCeedSw(); bengans.year = 2014; if (mycar.year < bengans.year) { System.out.println( I need a new car ); Beskrivs av Instansierar mycar = new KiaCeedSw(); mycar.year = 2018; Objekt System.out.println( My Kia is from + mycar.year) 10
Objekt (3) 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 11
Om Variabler... Sedan tidigare kände vi till tre typer: Lokala variabler (finns lokalt inne i metoder) Parametrar (data som skickas in till metoder via ett anrop) Konstanter (data som inte får förändras under körning) Nu har vi även: Instansvariabler (data varje objekt sparar) Hur/Var en variabel deklareras är viktigt för dess livslängd och tillgänglighet! 12
Konstruktorer Är en speciell metod som används för att initiera ett objekt Körs när man kör new... Heter samma som klassen. 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. 13
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; Refererar till den egna instansen Varför bättre? Ungefär lika mycket att skriva... 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); 14
Konstruktorer (forts) Är viktiga! För att Lägger över ansvaret på skapandet av objektet på objektet själv. Förhindrar skapandet av default -objekt. Gör klassen smidig att använda. Bör komma som första metod(er) I klassen. (Under instansvariablerna). 15
Statiska metoder och variabler public class KiaCeedSW{ Color color; int modelyear; String licenseplate; KiaCeedSw mykia = new KiaCeedSW(Gray, 2010, KPY038 ); static String manufacturer = Kia Motors ; static double rating = 7.2; public KiaCeedSW(. // Konstruktorn KiaCeedSw gulliskia = new KiaCeedSW(Red, 2011, RJU552 ); 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. 16
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) 17
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. 18
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 Instansmetoder (vi behöver en instans för att komma åt dem).printmanufacturer() Klassmetod (static) (vi behöver inte en instans för att komma åt dem) 19
Statisk kontext För metoder innebär detta att när vi kör så kan vi antingen vara i en statisk eller icke-statisk kontext. Om vi under körning befinner oss i en klassmetod (deklarerad med static), så är vi i en statisk kontext. I praktiken kan man fråga sig detta är vi just nu i ett objekt?. Om svaret är nej så är vi i en statisk kontext. När vi är i en statisk kontext, kan vi inte komma åt några instansvariabler (ty vi har ingen instans) och referensen this kan inte användas (eftersom den annars refererar till nuvarande instans). Programmet börjar alltid i statisk kontext (main är ju static). 20
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. 21
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 Klassmetoder Klassvariabler Klass Beskrivs av Dessutom: Man behöver (bör) inte gå via en instans för att komma åt en klassmetod/klassvariabel Instantierar Objekt Instansmetoder Instansvariabler 22
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?? 23
Introduktion till OOP(3) 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 24
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! 25
Inkapsling Ex. En videobutik. 26
Inkapsling (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 RO pawn.posy = 2; R 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 27
Inkapsling (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; G pawn.posy = 2; BU... 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 28
(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 Koden ändras ju medan vi skapar den! 29 Designa programmet så att ändringar blir så smärtfria som möjligt.
(En parentes) Ändra synsätt på att programmera: Från: Få specifikationerna X, skapa program Y, KLART! Till: Levande programvara. Ändringar i koden är naturliga. 30 Designa programmet så att ändringar blir så smärtfria som möjligt.
Synlighet Varför blir det så här? Och hur borde man göra då? class ChessBoard { void setup() { ChessPiece pawn = = ChessPiece pawn pawn.posx = 1; new ChessPiece(1, 2); pawn.posy = 2;... class ChessPiece { private int posx; private int posy; String name; B E F R Ö R O F E R class ChessGame { Å N void G Dplay() { A E N pawn.increasey(1); pawn.posy++... y x class ChessRules { boolean ischeckmate() { (king.ispositioned()... if (king.posy ==...... 31
Synlighet (2) 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 32
Synlighet (3) 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. 33
Synlighet (4) 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 34
Synlighet (5) Exempel: god programmeringssed public class KiaCeedSW { private String licenseplate; public void setplate(string newplate) { licenseplate = newplate; public String getplate() { return licenseplate; Använd getters och setters för att komma åt medlemsvariabler utanför 35 klassen.