Klasser
Kommer ta upp följande begrepp:
• Design av en klass
• Implementera en klass
• Testa en klass med en mainmetod
• Instansvariabler, lokala variabler, formella
parametrar, aktuella parametrar och
variablers räckvidd (scope)
• Synlighet (private, public)
• Inkapsling
• Motiv för att ha klasser
• Javadoc
Klasser
1
Design av en klass BankAccount som
representerar ett bankkonto
Steg 1: Instansvariablerna
Ett bankkonto har
• ett saldo
• ett kontonummer
Vi döper klassens två instansvariabler till
balance och accountNumber, som bör vara
• av typen:
double resp. String
(alternativt accountNumber är en int)
Klasser
2
Steg 2: Konstruktorerna
Hur önskar man konstruera/skapa ett
BankAccount-objekt?
Jo, kanske så här:
BankAccount b = new BankAccount("1294-695");
dvs vi anger kontonumret.
Saldot i det skapade kontot skall bli noll.
Konstruktorn har en String-parameter.
Klasser
3
Steg 3: Metoderna
Accessors?
• Få veta saldot.
• Få veta kontonumret.
Vi namnger dem
• getBalance: returnerar saldot
• getAccountNumber: returnerar kontonumret
Metoderna har inga parametrar.
Klasser
4
Steg 4: Metoderna forts...
Mutators?
• Stoppa in pengar
• Ta ut pengar
(Metod för att kunna ändra kontonumret är nog ologiskt)
Vi namnger metoderna
• deposit, har en parameter som är beloppet som
stoppas in
• withdraw, har en parameter som är beloppet
som tas ut
Metoderna returnerar inget...
Nja, är det så säkert det? Tänk om vi försöker ta ut ett för stort
belopp?
Metoden withdraw bör kanske returnera en ? boolean
Klasser
5
Den färdiga designen sammanfattad i
ett s.k. klassdiagram
Klassen BankAccount:
Instansvariabler:
-balance: double
-accountNumber: String
Konstruktorer:
+BankAccount(accNum:String)
Metoder:
+deposit(b:double):void
Inte så säker metod
+withdraw(b:double):void
+getBalance(): double
+getAccountNumber(): String
- Betyder private
+ betyder public
Klasser
6
Från klassdiagrammet skriver vi klassen i en (text)fil
BankAccount.java.
(http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t03/BankAccount.java)
Det är i denna fil som hela klassen finns beskriven, dvs är
definierad. Vi kikar på hur den färdiga klassen ser ut.
Vi ser att den innehåller en toString-metod, en metod som
returnerar en String, med info om objektet. Syftet med den
metoden är att man skall kunna skriva ut ett objekts info i
textform för att t.ex. kunna skriva ut med
System.out.println.
Vi testar klassen i DrJava’s Interactions.
Klasser
7
• Vi studerar klassen Test_BankAccount
(http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t03/Test_BankAccount.java)
som har en mainmetod som testar klassen BankAccount
– vi kör denna.
• Vi tar bort (kommenterar bort) toString-metoden och kör
Test_BankAccount igen och studerar vad som händer.
• Vi modifierar metoden withdraw i klassen BankAccount
så att den blir säkrare så att den kontriollerar att det finns
pengar att ta ut. Testar klassen med Test_BankAccount.
• Tar upp vad som händer när man kör main-metoden sats
för sats, vilka delar/satser i klassen BankAccount körs och
hur ser det ut minnet i varje steg.
•
Notera att man kan skriva en main-metod i klassen BankAccount
Klasser
8
Instansvariabler, lokala variabler, formella parametrar,
aktuella parametrar
Vi tar upp dessa begrepp med klassen BankAccount och
programmet TestBankAccount som exempel.
Tar även upp begreppet räckvidd (scope) för variabler.
Klasser
9
Synlighet: public resp private
public: åtkomst från andra klasser
private: åtkomst bara inom klassen
(finns även åtkomsttypen protected)
Skriver man varken eller blir det s.k. paketsynlighet, dvs det blir public i de klasser som finns i samma
mapp i filsystemet, annars private. I den här kursen kommer vi konsekvent att sätta instansvariablerna till
private och metoderna (och klasserna) till public.
Om instansvariablerna vore public? Då kan man komma åt
instansvariablerna med punktnotation, exempelvis:
BankAccount b = new BankAccount("ABC-123");
b.balance = 10000;
b.accountNumber = "ABC-523";
b.balance = -999999999;
• Kommer åt instansvariablerna med punktnotation
• Skyddet för instansvariablerna finns därmed inte, vilket
medför att objekt kan hanteras helt fel.
• Metoderna ”behövs” inte Klasser
10
Javadoc?
Vi klickar på Javadoc i DrJava för klassen
BankAccount och ser vad som händer?
Klasser
11
Vi jämför med klassen Turtle
Vi kikar på instansvariablerna som finns överst i
Turtle.java
Vi kikar på javakoden för några metoder
Vi skapar en Turtle och kollar vad toStringmetoden ger för resultat och kikar på metodens
javakod
Vi kikar på dokumentationsfilen (finns på
kurswebbens länksida)
Klasser
12
Inkapsling
• Till ett objekt hör metoder och instansvariabler.
• All kommunikation med objektet sker via metoder.
• Endast objektet vet om sina instansvariabler.
• Via metoderna kan man ändra instansvariablerna och
få veta dess värden.
Ändra något i
objektet
Få veta värdet
av instans-
variabel
Ändra
instansvariabel
Instansvariabler
Klasser
Få veta
något om
objektet
13
Inkapsling – ett nyckelbegrepp inom
objektorienterad programmering
• Ett objekts exakta beteende och funktion är dold för
omvärlden.
• Varje klass är en abstraktion och visar ett gränssnitt
mot omvärlden som specificerar hur andra klasser får
interagera med den.
• Detta garanterar att alla förändringar av ett objekt sker
genom programkod som tillhör objektets klass.
•
Ett visst objekt kan inte påverka ett annat objekt på
annat sätt än genom detta objekts gränssnitt.
Klasser
14
Motiv för BankAccount-klassen
Antag att vi ska skriva ett program som hanterar
bankkonton som har ett kontonummer och ett saldo
Alt 1 - med en String-variabel och en double-variabel
String accountNumber = "1272-9";
double balance = 999.00;
Alt 2 – med en BankAccount-variabel
BankAccount b = new BankAccount("1272-9");
Punktnotationen: Före punkten står
b.deposit(999.00);
objektet. Efter står metodens namn
Alt 1: Två variabler för att hantera ett bankkonto.
Alt 2: En variabel som refererar till två värden (kontot).
Alt 2: Metoderna i klassen BankAccount garanterar en
robust hantering av ett bankkonto
Klasser
15
Om fler bankkonton…
Alt 1 - med en String-variabel och en double-variabel
String
double
String
double
…
accountNumber1 = "1272-9";
balance1 = 999.00;
accountNumber2 = "1414-6";
balance1 = 23.00;
Alt 2 – med en BankAccount-variabel
BankAccount b1 = new BankAccount("1272-9");
b.deposit(999.00);
BankAccount b2 = new BankAccount("1414-6");
b.deposit(23.00);
Nästa föreläsning: Fiffigare med arrayer av BankAccount
Klasser
16