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