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