Objekt och metoder Objektorientering Objektorientering

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