Grundläggande programmering, STS 1, VT 2007. Sven Sandberg Föreläsning 14 ● I torsdags & fredags: arrayer – – – – ● Deklaration, initiering, åtkomst Arrayer är referenser Arrayer som parametrar och returvärden Exempel Idag, eftermiddag: Mer arrayer! – – Flerdimensionella arrayer Dessutom: klasser som ingår i Java Föreläsning 14 ● Idag, förmiddag: arv och avancerad OO – – ● Arv: exempel och teori Arv: vad det är bra för Imorn: – Arv: Ett större exempel ● Kommer på labben! Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Arv: ett exempel ● Vi minns Person-klassen från lektion 2: – Klassen Person har: ● ● ● ● Vi behöver skapa en klass Student – Klassen Student ska ha: ● ● ● ● ● namn adress ålder namn adress ålder poäng Dom är ju nästan lika! Arv: ett exempel ● Vi kan återanvända Person-klassen när vi skapar Student-klassen class Student extends Person { } ● ● Nu innehåller Student redan från början allt som Person innehåller Vi behöver bara fylla på med det som skiljer: – poäng Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Arv-teori: Hur man ärver ● Skapa en klass Hund som ärver från klass Djur: class Hund extends Djur { ... } ● Djur kallas superklass till Hund ● Hund kallas subklass till Djur ● I Java kan en klass bara ärva från en annan klass Arv-teori: Vad innebär arv? ● Subklassen får alla publika metoder och variabler som superklassen har: public static void main(String[] args) { Student nora = new Student(”Nora”); Std.out.println(nora.geNamn()); } ● ● geNamn definierades i Person Eftersom Student ärver från Person, finns geNamn även i Student Arv-teori: Konstruktorer ● ● ● Subklassen kan anropa superklassens konstruktor från sin konstruktor Görs m.h.a. super (nyckelord i Java) Måste vara första raden i konstruktorn class Person { public Person(String namn, int alder) { ... } } class Student extends Person { public Student(String n, int a, int p) { super(n, a); Anropar konstruktorn poang = p; i superklassen Person } } Arv-teori: Överskuggning ● ● ● Subklassen kan definiera metoder med samma namn och parametrar som superklassen Subklassens metod ersätter superklassens Kallas överskuggning class Person { public void skrivUt() { ... } class Student extends Person { public void skrivUt() { ... } Överskuggar (ersätter) den ärvda skrivUt Arv-teori: Komma åt överskuggad metod ● ● Den överskuggade metoden kan anropas från subklassen m.h.a. super super refererar till ett objekt av superklassens typ class Person { public void skrivUt() { ... } class Student extends Person { public void skrivUt() { super.skrivUt(); ... } Anropar den överskuggade skrivUt i Person Arv-teori: Hur det ser ut i minnet class Student extends Person { ... } Student s = new Student(); Objekt av klassen Student innehåller ett objekt av klassen Person s: super i Student refererar till det ”inbyggda” Person-objektet Student Person super Arv-teori: public, protected och private ● ● Subklassen kommer åt publika variabler och metoder, men inte privata protected ligger mellan private och public: Synlig i: private protected public klassen själv subklasser andra klasser ja nej nej ja ja nej ja ja ja Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Arv-exempel: Bibblan ● ● ● Vi ska hjälpa biblioteket med ett program som håller reda på alla låntagare och lån Biblioteket har böcker och filmer Vårt program behöver följande klasser: Person Lantagare ● Verk Film Pilarna anger arv: – från subklass till superklass Bok Arv-exempel: Bibblan Person Lantagare ● ● ● ● ● ● Verk Film Bok Vi skapar klasserna Verk, Bok och Film Ett Verk har en titel och en lånestatus En Bok har dessutom en författare En Film har dessutom en längd Alla klasser kan skapas och skrivas ut. Instansvariablerna kan läsas av Alla Verk kan lånas och lämnas tillbaka Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Återanvändning: Varför ● Varför återanvända kod? – Programmeraren kan koncentrera sig på kärnan av sin uppgift, slipper ”återuppfinna hjulet” – Stora uppgifter kan bli överskådliga för programmeraren – Spar tid & pengar – Om något behöver ändras, räcker det att ändra på ett ställe Återanvändning ● ● ● Mål: återanvänd kod Hur? Objektorienterat synsätt: – Målet nås genom inkapsling och arv Återanvändning: genom inkapsling ● ● Mål: återanvänd kod Hur? – Idé 1: inkapsling ● Ett objekt sköter sig själv så mycket som möjligt ● ● ● Objektets inälvor skyddas → trygghet Skilj på det som används internt och det som används av andra → struktur, tydlighet För den som återanvänder: tydligt vilka metoder som är relevanta Återanvändning: genom arv ● ● Mål: återanvänd kod Hur? – – Idé 1: inkapsling Idé 2: arv = befintlig klass utökas ● En hel klass återanvänds för att skapa en annan klass ● Exempel: Vi kan återanvända: Person Fordon Organism Djur Däggdjur när vi skapar: Student, Lärare Cykel, Bil, Båt Djur Däggdjur Gris Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Relationer mellan klasser: överblick ● Har (kallas komposition) – – Anger beståndsdelar Exempel: ● ● ● Känner till – – Anger kännedom Exempel: ● ● ● En person har ett personnummer En bok har en titel En person känner till sin make/maka En låntagare känner till de böcker hon/han lånat Är (kallas arv) – – Anger utökning Exempel: ● ● En student är en sorts person En bok är en sorts verk Relationer mellan klasser: Har (komposition) ● Anger beståndsdelar, inneslutning ● Exempel: – – – ● En person har ett personnummer En bil har fyra hjul En Rektangel har två Horn I Java: instansvariabel class Person { private String namn; private String adress; private int alder; } Person har dessa Relationer mellan klasser: Känner till ● ● Anger kännedom Exempel: – – ● I skatteverkets register: ● En person känner till sin make/maka I bibliotekets register: ● En låntagare känner till sina böcker ● Författarregistret känner till varje författare I Java: instansvariabel som är referens class Person { private Person makeMaka; } class Lantagare extends Person { private Bok[] bocker; } Person känner till sin make/maka Lantagare känner till sina böcker Relationer mellan klasser: Är (arv) ● ● Anger utökning, d.v.s. arv Exempel: – – – ● En student är en sorts person En STS-student är en sorts student En lärare är en sorts person Bildar en hierarki: Person Lärare Student STS-Student Relationer mellan klasser: Är-relationen bildar en hierarki class Person { private String namn; public String geNamn() { return namn; } } Relationer mellan klasser: Är-relationen bildar en hierarki class Person { private String namn; public String geNamn() { return namn; } } class Larare extends Person { private int rumsNr; public int geRumsNr() { return rumsNr; } } Relationer mellan klasser: Är-relationen bildar en hierarki class Person { private String namn; public String geNamn() { return namn; } } class Larare extends Person { private int rumsNr; public int geRumsNr() { return rumsNr; } } class Student extends Person { private int poang; public int gePoang() { return poang; } } Relationer mellan klasser: Är-relationen bildar en hierarki class Person { private String namn; public String geNamn() { return namn; } } class Student extends Person { private int poang; public int gePoang() { return poang; } } class Larare extends Person { private int rumsNr; public int geRumsNr() { return rumsNr; } } class STSStudent extends Student { private int labGrupp; public int geLabGrupp() { return labGrupp; } } Dagens föreläsning: arv ● ● Vad och hur – Ett exempel – Teori – Ett till exempel Varför – Återanvändning – Relationer mellan klasser – Polymorfism Polymorfism: Exempel ● ● Biblioteket behöver ett register över alla Verk Klasen VerkRegister kan spara alla Verk i en array. Ett fragment av klassen: class VerkRegister { private Verk[] register; private int antalVerk; public void laggInVerk(Verk verk) { register[antalVerk] = verk; antalVerk++; } } ● Kan man lägga in böcker och filmer i registret? Polymorfism: Exempel class VerkRegister { private Verk[] register; private int antalVerk; public void laggInVerk(Verk verk) { register[antalVerk] = verk; antalVerk++; } } ● ● ● Man kan lägga in böcker och skivor i registret! Går eftersom de är subklasser till Verk Kallas polymorfism – – poly = många, morphos = form ett Verk kan ha många former Polymorfism: Teori ● Regel: – – – ● Andra hållet funkar inte: – – ● Antag att Hund är subklass till Djur Om en variabel är av typ Djur, kan den referera till objekt av typ Hund En hund är ett djur Om en variabel är av typ Hund, kan den INTE referera till objekt av typ Djur Ett djur är inte en hund Funkar för parametrar till metoder – Till en metod som tar Djur som parameter kan vi skicka en Hund Arv-teori: Klassen Object ● ● ● Alla klasser i Java ärver automatiskt Object ”förfader” till alla klasser Har några generella metoder (som vi inte använder i denna kurs