och metoder Introduktion till objektorienterad programmering Markus Saers markus.saers@lingfil.uu.se orientering Deklarativ programmering Beskriver förutsättningarna för något Prolog Imperativ programmering Beskriver hur något ska göras C orientering Deklarativ programmering Beskriver förutsättningarna för något Prolog orienterad programmering Beskriver de saker som kan finnas Beskriver hur dessa saker ska agera Imperativ programmering Beskriver hur något ska göras C Viktiga begrepp Klass Instansvariabel Metod Klass Utgör en ritning som används för att skapa objekt Definierar hur objekt av den aktuella klassen ska bete sig Viss variation tillåts enligt ritningen Tidsangivelser n-gram Tillhör en klass Befinner sig i ett tillstånd Specificerar hur den skiljer sig från andra objekt inom samma klass Tidsangivelser (10:22:14) n-gram ( jag gillar kaffe ) 1
Instansvariabler Kallas även attribut Beskriver ett objekts status Det som gör att objektet kan skilja sig från andra objekt av samma klass. Tidsangivelser (timmar, minuter, sekunder) n-gram (en fältvariable av längd n med strängar) Metoder Beskriver beteendet hos objekten i en klass Låter objektet rapportera om eller manipulera sitt tillstånd Tidsangivelser (ställ in tid, ticka framåt) n-gram (hämta ord på plats k, skapa en strängrepresentation) UML (Unified Modeling Language) Klasser i Java Klass Tidsangivelse timmar : int minuter : int sekunder : int sätttid(t: int, m: int, s: int) ticka() ticka(sekunder: int) läsavtid() : String lektionstart : Tidsangivelse timmar = 10 minuter = 15 sekunder = 0 lektionslut : Tidsangivelse timmar = 12 minuter = 0 sekunder = 0 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 i Java public class Tidsangivelse { // Instansvariabler private int timmar; private int minuter; private int sekunder; // 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 ; Skapas med det reserverade ordet new 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
i Java Metoder i Java public class TestaTidsangivelse { 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()); Beskriver vad man kan göra med ett objekt 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 Börja med liten bokstav och kapitalisera vid ordgräns ettbrametodnamnkanseutsåhär ticka läsavtid Ge deskriptiva namn! Metoder: argumentlista En lista av deklarationer av variabler som ska finns tillgängliga för metoden 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 Deklarerar vad metoden resulterar i (vad det är för typ på det man får tillbaka) 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 Metoder: synlighet Beskriver vilka andra objekt som kan se metoden Fyra olika synlighetsgrader 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 Består av de programsatser som ska köras när metoden anropas Tillgängligt för användning: et 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 Metoder och variabler Lägg märke till likheten mellan deklarationer av variabler och metoder! <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? Variabler int timmar; timmar = 10; int timmar = 10; Tidsangivelse t = new Tidsangivelse(); t.sätttid(10, 15, 0);? Konstruktorer Tillåter att man ger ett antal argument vid konstruerandet av ett objekt, så att det börjar i ett visst tillstånd. 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 { // Instansvariabler int timmar; int minuter; int sekunder; // Konstruktorer public Tidsangivelse(int t, int m, int s) { timmar = t; minuter = m; sekunder = s; public Tidsangivelse() { this(0, 0, 0); // Metoder Variabler int timmar; timmar = 10; int timmar = 10; Tidsangivelse t = new Tidsangivelse(); t.sätttid(10, 15, 0); Tidsangivelse t = new Tidsangivelse(10, 15, 0); Finns något mer än objekt? Var/hur skapas det första objektet? Klasser kan ha variabler och metoder! 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. Klassvariabler/-metoder Existerar oberoende av objekt av klassen Deklareras med det reserverade ordet static Finns alltid tillgängliga Nås med hjälp av klassnamnet System.out.println(); Tidsangivelse.formatSträng Sammanfattning God programmering Klasser Klassvariabler Klassmetoder (Konstruktorer) Instansvariabler Metoder Lokala variabler Vad innebär det att skiva bra program? Olika i olika programmeringsparadigm Vad innebär det att skriva bra objektorienterade program? 5
Bra objektorienterad programmering Arv Inkapslat Dölj det som inte behöver synas (alla instansvariabler) 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 En klass kan vara en slags <annan klass> En pingvin är en sorts fågel Ett trigram är ett sorts n-gram 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 Klasser som inte går att skapa objekt av Finns bara till för att ärvas ner Deklareras med det reserverade ordet abstract En klass som innehåller en eller flera abstrakta metoder måste vara abstrakt Djurexemplet public abstract class Djur { private String namn; protected void setnamn(string namn) { this.namn = namn; public Djur(String namn) { this.namn = namn; public Djur() { this.namn = "en/ett " + art(); public String art() { return "djur"; public abstract boolean kanflyga(); public abstract boolean köttätare(); public abstract boolean harnäbb(); public abstract boolean hardifferentieradtandrad(); public String tostring() { return namn + " (" + art() + ")"; Djurexemplet Djurexemplet public abstract class Däggdjur extends Djur { public String art() { return "däggdjur"; 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 boolean kanflyga() { return true; public boolean köttätare() { return true; public boolean harnäbb() { return true; public boolean hardifferentieradtandrad() { return false; public class Varg extends Däggdjur { public String art() { return "varg"; public boolean köttätare() { return true; 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 Fågel Däggdjur [ ] Fågel [+] Varg Får Mås Pingvin Varg Får 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