TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, 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() { System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa; lisa.printage(); Ett objekt måste instantieras innan det kan användas. 2
Hitta felet! public class Human { int age; public void printage() { System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa = new Human(); lisa.printage(); 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; // This is the constructor Defaultkonstruktorn: public Human(int age) { public Human() { this.age = age; public void printage() { System.out.println("Jag är " + age + " år gammal"); public static void main(string[] args) { Human lisa = new Human(21); lisa.printage(); 4
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. 5
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 6
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 7
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 8
Synlighet(3) Exempel: god programmeringssed public class Car { private String model; public void setmodel(string newmodel) { model = newmodel; public String getmodel() { return model; Använd getters och setters för att komma åt medlemsvariabler utanför klassen. 9
Arv Möt tre studenter Gymnasiestudenten Anna Högskolestudenten Harry Impulsive Ivar Gillar att lösa problem med penna och papper Har just läst TDDC30 Gillar att lösa problem med en väl skriven programmeringsalgoritm Har just fyllt nio Gillar huvudbonader och att gå ut på rast 10
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); 11
Arv(3) Anna är en Student som gillar att lösa problem med penna och papper public class HighSchoolStudent extends Student { // 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 ; 12
Arv(4) Harry är en Student som gillar att lösa problem med en väl skriven programmeringsalgoritm public class CollegeStudent extends Student { // I am overriding solveproblem with my implementation public String solveproblem(string problem) { System.out.println( Solving with Java. ); return The answer is + (84 / 2); 13
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; 14
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() 15 Förbjuda subklassning och överskuggning? Använd final
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 ofta överskuggas 16
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 17
UML Beskrivning av en klass + public - private # protected ~ package private understruken static Italic abstrakt / derived Klassnamn Attribut Metoder 18
UML Beskrivning av relationer mellan klasser Association Har en referens till Aggregation - äger en OBS vag definition inom Java, undvik att använda Komposition A består av B Generalisering (arv) A ärver från B A kan användas som en B Realisering (interface) Beroende Multiplicitet exempel: A har minst en referens till B 19
UML Exempel: UML-beskrivning av Studentklasserna 20
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); 21