TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Konstruktorer Statiska metoder & attribut Synlighet Arv och polymorfism Unified Modelling Language 1
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 instantieras innan det kan användas. 2
public class Human { Hitta felet! int age; = 27; public void printage() { int unusedvar; System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa = new Human(); lisa.age = 27; lisa.printage(); Nu kommer alla Humans vi skapar ha age 27... På På skärmen: Jag är är 027 år år gammal gammal Instansvariabler måste tilldelas ett värde innan de används. 3
Konstruktorer Används för att initiera ett objekt Kan finnas flera konstruktorer Kan även helt sakna konstruktorer (En tom defaultkonstruktor skapas av kompilatorn) public class Human { int age; // Detta är konstruktorn Defaultkonstruktorn: public Human(int startingage) { public Human() { age = startingage; public void printage() { System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa = new Human(27); lisa.printage(); 4
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: Movie m = new Movie() m.year = 1999; m.title = The Matrix ; m.rating = 10.0; Vid instansiering (med konstruktor): Movie favomovie = new Movie(1999, The Matrix, 10.0); 5
Statiska metoder & attribut public class KiaCeedSW{ Color color; int modelyear; String licenseplate; public KiaCeedSW(. // Konstruktorn KiaCeedSw mykia = new KiaCeedSW(Gray, 2010, KPY038 ); 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. KiaCeedSw gulliskia = new KiaCeedSW(Red, 2011, RJU552 ); KiaCeedSw tjskia = new KiaCeedSW(Black, 2012, FFS123 ); static String manufacturer = Kia Motors Corporation ; static double rating = 7.2; 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. 6
Statiska metoder & attribut public class KiaCeedSW{ Color color; int modelyear; String licenseplate; public KiaCeedSW(. // Konstruktorn KiaCeedSw mykia = new KiaCeedSW(Gray, 2010, KPY038 ); KiaCeedSw gulliskia = new KiaCeedSW(Red, 2011, RJU552 ); KiaCeedSw tjskia = new KiaCeedSW(Black, static String manufacturer = Kia Motors Corporation ; 2012, FFS123 ); static double rating = 7.2; 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) 7
Statiska metoder & attribut public class KiaCeedSW{ Color color; int modelyear; String licenseplate; public KiaCeedSW(. // Konstruktorn KiaCeedSw mykia = new KiaCeedSW(Gray, 2010, KPY038 ); KiaCeedSw gulliskia = new KiaCeedSW(Red, 2011, RJU552 ); KiaCeedSw tjskia = new KiaCeedSW(Black, static String manufacturer = Kia Motors Corporation ; 2012, FFS123 ); static double rating = 7.2; Från en instans kan man komma åt klassvariabler: mykia.manufacturer Detta är ju rimligt, men kanske inte så tydligt. 8
Statiska metoder & attribut public class KiaCeedSW{ public void drive() { public static void givenewrating(double d) { public void setcolor(color newcolor) { public static void printmanufacturer() { KiaCeedSw mykia = new KiaCeedSW(Gray, 2010, KPY038 ); Vi kan göra samma uppdelning för metoder. KiaCeedSw gulliskia = new KiaCeedSW(Red, 2011, RJU552 ); KiaCeedSw tjskia = new KiaCeedSW(Black, 2012, FFS123 ); mykia.drive() mykia.setcolor(gold) Instansmetoder (vi behöver en instans för att komma åt dem) KiaCeedSW.giveNewRating(8.75) KiaCeedSW.printManufacturer() Klassmetod (static) (vi behöver inte en instans för att komma åt dem) 9
Statiska metoder & attribut 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. 10
Statiska metoder & attribut Instansmetoder kommer åt både klass- och instansvariabler Klassmetoder kommer endast åt klassvariabler static Klassmetoder Klassvariabler Klass En instansvariabel hör till en specifik instans En klassvariabel delas mellan alla instanser Dessutom: Beskrivs av Instansmetoder Objekt Instantierar Man behöver (bör) inte gå via en instans för att komma åt en klassmetod/klassvariabel Instansvariabler 11
Synlighet Ex. En videobutik. 12
Synlighet 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 13
Synlighet(2) Dölj implementationen, visa upp ett gränssnitt. God sed och vana: 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 14
Synlighet(3) 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 klassen. 15
Arv Möt tre studenter Gymnasiestudenten Anna Högskolestudenten Harry Impulsive Ivar Har ett skåp. Gillar att lösa problem med penna och papper Har ett antal avklarade HP. Gillar att lösa problem med en väl skriven programmeringsalgoritm Gillar huvudbonader och att gå ut på rast Vägrar att lösa problem. 16
Arv(2) Hur skulle detta se ut Imperativt? (utan objektorientering) Många fullständiga uppräkningar => svårt att underhålla och utöka. Vi löser det istället objektorienterat med en klasshierarki. Alla studenter bör kunna studera och lösa uppgifter. Den gemensam klassen Student får ha dessa metoder. public class Student { public void study() { System.out.println("I am studying very hard."); public String solveproblem(string problem) { System.out.println( I give up!"); return null; 17
Arv(3) Vi lägger till saker som är specifikt för gymnasieelever i denna klass. En gymnasieelever är en Student. => Arv! Vi kan ändra beteenden från Student genom överskuggning. public class HighSchoolStudent extends Student { public void openlocker() { System.out.println( Lots of junk in here ); // I am overriding solveproblem with my implementation public String solveproblem(string problem) { System.out.println( Solving with pen & paper. ); return The answer is 84 / 2 ; 18
Arv(4) Harry är en Student som gillar att lösa problem med en väl skriven programmeringsalgoritm public class CollegeStudent extends Student { private int HP; public int gethp() { return HP; // I am overriding solveproblem with my implementation public String solveproblem(string problem) { System.out.println( Solving with Java. ); return The answer is + (84 / 2); 19
Arv(5) Ivar är en Student som just fyllt nio.. public class YoungStudent extends Student { //This is an override of the already implemented method in // Student! public void study() { System.out.println( *Puts book on head* ); // I am overriding solveproblem with my implementation public String solveproblem(string problem) { System.out.println( No! ); return null; 20
Arv(2) Alla studenter bör kunna studera och lösa uppgifter Men den perfekte studenten är ett abstrakt koncept.. public abstract class Student { public void study() { System.out.println("I am studying very hard."); // this method has to be implemented by concrete // students public abstract String solveproblem(string problem); 21
Arv(6) Några termer: Superklass, Basklass Subklass, härledd klass (en. Derived class) Överskugga (en. Override) "Föräldraklassen" En klass som ärver från en superklass Implementera eller ersätt en metod från en superklass (eller ett interface) HighSchoolStudent, CollegeStudent och YoungStudent ärver ifrån Student Samtliga (ej abstrakta) subklasser till Student måste implementera den abstrakta metoden solveproblem() Subklasser till Student får överskugga study() För att komma åt superklassen från subklassen, använd super Förbjuda subklassning och överskuggning? Använd final 22
Object Alla klasser ärver automatiskt från Object, direkt eller indirekt Visar på att arv i flera led är möjligt Några metoder som finns i klassen Object boolean equals(object other) Object clone() String tostring() void finalize() Dessa metoder behöver ibland överskuggas 23
UML Unified Modelling Language Ett grafiskt språk för att beskriva objektorienterade system i alla steg i programvarutvecklingen De-fakto industristandard idag I den här kursen koncentrerar vi oss på klassdiagram 24
UML Beskrivning av en klass + public - private # protected ~ package private understruken static Italic abstrakt / derived Klassnamn Attribut Metoder 25
UML Beskrivning av relationer mellan klasser Association A använder en B Aggregation A har en B OBS vag definition inom Java, undvik att använda Komposition A äger en B Generalisering (arv) A ärver från B (A kan användas som en B) Realisering (interface) A implementerar B Beroende A är beroende av B Multiplicitet exempel: En A använder en eller flera B 26
UML Exempel: UML-beskrivning av Studentklasserna Student +study() +solveproblem(string problem) : String HighSchoolStudent +openlocker() +solveproblem(string problem) : String YoungStudent +study() +solveproblem(string problem) : String CollegeStudent - int HP +solveproblem(string problem) : String +gethp(): int 27
Polymorfism poly-morf (grek.) = många former public class PolyMorphExample { public static void morphschool(student student) { student.study(); student.solveproblem( What is the matrix? ); Kan vara vilken subklass som helst Dröjer tills körningsögonblicket innan det bestäms Endast det som är deklarerat i Student är tillgängligt public static void main(string[] args) { HighSchoolStudent anna = new HighSchoolStudent(); PolyMorphExample.morphSchool(anna); 28