Objekt och metoder Objektorientering Deklarativ programmering Introduktion till objektorienterad programmering Beskriver förutsättningarna för något Prolog Markus Saers [email protected] Imperativ programmering Beskriver hur något ska göras C Objektorientering Viktiga begrepp Deklarativ programmering Klass Beskriver förutsättningarna för något Prolog Objektorienterad programmering Beskriver de saker som kan finnas Beskriver hur dessa saker ska agera Objekt Instansvariabel Metod Imperativ programmering Beskriver hur något ska göras C Klass Objekt Utgör en ritning som används för att skapa objekt Tillhör en klass Definierar hur objekt av den aktuella klassen ska bete sig Specificerar hur den skiljer sig från andra objekt inom samma klass Viss variation tillåts enligt ritningen Exempel: Exempel: Tidsangivelser n-gram Befinner sig i ett tillstånd Tidsangivelser (10:22:14) n-gram (”jag gillar kaffe”) 1 Instansvariabler Metoder Kallas även attribut Beskriver beteendet hos objekten i en klass Beskriver ett objekts status Det som gör att objektet kan skilja sig från andra objekt av samma klass. Exempel: Exempel: Tidsangivelser (timmar, minuter, sekunder) n-gram (en fältvariable av längd n med strängar) UML (Unified Modeling Language) Klass Tidsangivelse timmar : int minuter : int sekunder : int sättTid(t: int, m: int, s: int) ticka() ticka(sekunder: int) läsAvTid() : String Låter objektet rapportera om eller manipulera sitt tillstånd Objekt lektionStart : Tidsangivelse timmar = 10 minuter = 15 sekunder = 0 lektionSlut : Tidsangivelse timmar = 12 minuter = 0 sekunder = 0 Tidsangivelser (ställ in tid, ticka framåt) n-gram (hämta ord på plats k, skapa en strängrepresentation) Klasser i Java Deklareras med det reserverade ordet class Namnet ska börja med stor bokstav DetHärÄrEttBraKlassnamn Filen som klassen ligger i ska heta samma sak som klassen, och avslutas med .java DetHärÄrEttBraKlassnamn.java Klasser i Java Objekt i Java public class Tidsangivelse { // Instansvariabler private int timmar; private int minuter; private int sekunder; Skapas med det reserverade ordet new // Metoder public void sättTid(int t, int m, inte s) { // implementation } public void ticka() { // implementation } public void ticka(int sekunder) { // implementation } public String läsAvTid() { // implementation som avslutas med ”return <String>;” return ”en sträng som representerar tidsangivelsen”; } Variabler som pekar på objekt måste vara korrekt deklarerade Ett objekt har tillgång till de metoder som finns definierade i den klass det tillhör } 2 Objekt i Java Metoder i Java public class TestaTidsangivelse { Beskriver vad man kan göra med ett objekt public static void main(String[] args) { Tidsangivelse lektionStart = new Tidsangivelse(); lektionStart.sättTid(10, 15, 0); System.out.print(”Lektionen började: ”); System.out.println(lektionStart.läsAvTid()); Tidsangivelse lektionSlut = new Tidsangivelse(); lektionSlut.sättTid(12, 0, 0); System.out.print(”Lektionen ska sluta: ”); System.out.println(lektionSlut.läsAvTid()); } Har följande egenskaper Namn Argumentlista Resultattyp Synlighet Implementation } Metoder i Java Metoder i Java public void ticka(int sekunder) { this.sekunder += sekunder } public void ticka(int sekunder) { this.sekunder += sekunder } Synlighet Resultattyp Namn Argumentlista Implementation public String läsAvTid() { return timmar.toString() + ”:” + minuter.toString() + ”:” + sekunder.toString(); } public String läsAvTid() { return timmar.toString() + ”:” + minuter.toString() + ”:” + sekunder.toString(); } Metoder: namn Metoder: argumentlista Börja med liten bokstav och kapitalisera vid ordgräns En lista av deklarationer av variabler som ska finns tillgängliga för metoden ettBraMetodnamnKanSeUtSåhär ticka läsAvTid Ge deskriptiva namn! Deklaration = <typ> <namn> Värden på variablerna ska skickas med när metoden anropas Exempel Metoden sättTid(int t, int m, int s) kan anropas med sättTid(10, 15, 0); 3 Metoder: resultattyp Metoder: synlighet Deklarerar vad metoden resulterar i (vad det är för typ på det man får tillbaka) Beskriver vilka andra objekt som kan se metoden Fyra olika synlighetsgrader Metoden måste innehålla en return-sats med något av den deklarerade typen som argument Kan vara void Metoder som inte ger något resultat förändrar i regel objektets tillstånd Exempelvis ticka() som ökar på antalet sekunder som en tidsangivelse anger private (package-private) Underförstått om inget annat specificeras protected public Vi kommer tillbaka till detta, men det är bra att ha sett de olika typerna Metoder: implementation Metoder och variabler Består av de programsatser som ska köras när metoden anropas Tillgängligt för användning: Lägg märke till likheten mellan deklarationer av variabler och metoder! Objektet och dess tillstånd (metoder och instansvariabler) Lokala variabler Deklareras i argumentlistan eller implementationen Kan ha samma namn som instansvariabler Instansvariabler kan alltid nås med hjälp av det reserverade ordet this. Exempelvis: this.sekunder += sekunder <synlighet> <typ> <namn> private int timmar; public String läsAvTid() Metoder kan ses som dynamiska variabler vars värde varierar beroende på vilka argument som anges samt objektets tillstånd Initialvärden på objekt? Konstruktorer Variabler Tillåter att man ger ett antal argument vid konstruerandet av ett objekt, så att det börjar i ett visst tillstånd. int timmar; timmar = 10; int timmar = 10; Objekt Tidsangivelse t = new Tidsangivelse(); t.sättTid(10, 15, 0); ? Konstruktorer har klassnamnet som metodnamn och saknar resultattyp Om det inte finns någon konstruktor definierar java en standardkonstruktor som inte tar några argument, och inte gör någonting 4 Konstruktorer i Java Initialvärden på objekt! public class Tidsangivelse { Variabler // Instansvariabler int timmar; int minuter; int sekunder; int timmar; timmar = 10; // Konstruktorer int timmar = 10; public Tidsangivelse(int t, int m, int s) { timmar = t; minuter = m; sekunder = s; } Objekt public Tidsangivelse() { this(0, 0, 0); } Tidsangivelse t = new Tidsangivelse(); t.sättTid(10, 15, 0); // Metoder … Tidsangivelse t = new Tidsangivelse(10, 15, 0); } Finns något mer än objekt? Klassvariabler/-metoder Var/hur skapas det ”första objektet”? Existerar oberoende av objekt av klassen Klasser kan ha variabler och metoder! Deklareras med det reserverade ordet static Ni har redan använt dessa: public static void main(String[] args) Startas när man anropar en klass från prompten System.out.println(”hej!”); Använder ”strömmen” out i klassen System för att skriva ut en sträng följt av ett nyradstecken i terminalen. Sammanfattning Finns alltid tillgängliga Nås med hjälp av klassnamnet System.out.println(); Tidsangivelse.formatSträng God programmering Klasser Objekt Vad innebär det att skiva bra program? Klassvariabler Instansvariabler Olika i olika programmeringsparadigm Klassmetoder Metoder Lokala variabler Vad innebär det att skriva bra objektorienterade program? (Konstruktorer) 5 Bra objektorienterad programmering Inkapslat Dölj det som inte behöver synas (alla instansvariabler) Arv En klass kan vara ”en slags <annan klass>” En pingvin är en sorts fågel Ett trigram är ett sorts n-gram Modulärt Lättare att använda saker som andra skrivit Lättförståligt Intuitiva variabel- och metodnamn Väldokumenterat All relevant information ska framgå av källkoden Har man skrivit en metod för en klass kan man låta en ny klass ärva den! Gör med det reserverade ordet extends … Abstrakta klasser Djurexemplet Klasser som inte går att skapa objekt av public abstract class Djur { private String namn; protected void setNamn(String namn) { this.namn = namn; } Finns bara till för att ärvas ner public Djur(String namn) { this.namn = namn; } public Djur() { this.namn = "en/ett " + art(); } Deklareras med det reserverade ordet abstract public String art() { return "djur"; } public public public public En klass som innehåller en eller flera abstrakta metoder måste vara abstrakt abstract abstract abstract abstract boolean boolean boolean boolean kanFlyga(); köttätare(); harNäbb(); harDifferentieradTandrad(); public String toString() { return namn + " (" + art() + ")"; } } Djurexemplet Djurexemplet public abstract class Däggdjur extends Djur { public String art() { return "däggdjur"; } public class Varg extends Däggdjur { public String art() { return "varg"; } public boolean köttätare() { return true; } } public boolean kanFlyga() { return false; } public boolean harNäbb() { return false; } public boolean harDifferentieradTandrad() { return true; } } public abstract class Fågel extends Djur { public String art() { return "fågel"; } public public public public } boolean boolean boolean boolean kanFlyga() { return true; } köttätare() { return true; } harNäbb() { return true; } harDifferentieradTandrad() { return false; } public class Får extends Däggdjur { public String art() { return "får"; } public boolean köttätare() { return false; } } public class Mås extends Fågel { public String art() { return "mås"; } } public class Pingvin extends Fågel { public String art() { return "pingvin"; } public boolean kanFlyga() { return false; } } 6 Djurexemplet Djurexemplet: flygförmåga Djur Djur Däggdjur Varg Får Däggdjur [–] Fågel Mås Pingvin Varg Får Fågel [+] Mås Pingvin [–] Att fundera på till nästa gång Vad är ett n-gram? Vad kan man ha det till? Vad vill du kunna göra med ett n-gram? 7