• No results found

Arv: fordonsexempel (forts)

N/A
N/A
Protected

Academic year: 2021

Share "Arv: fordonsexempel (forts)"

Copied!
11
0
0

Loading.... (view fulltext now)

Full text

(1)

Arv

• En klassdefinition class A extends B { ... }

definierar en klass A som ärver av B.

• Klassen A ärver alla fält och metoder som är definierade för B.

• A är en subklass till B.

• B är en superklass till A.

OOP m Java Sida 1

Arv, mer Java Sven-Olof Nyström

Arv: Ett exempel

Fyra klasser:

Fordon Motorfordon Bil

Cykel

Toppfarten för en cykel beräknas från cyklistens ålder.

Toppfarten för en bil beräknas från motorstykan.

Arv: Fordonsexempel

class Fordon { }

class Motorfordon extends Fordon { private double toppfart;

Motorfordon (double t) { toppfart = t;

}

double getToppfart() { return toppfart;

} }

OOP m Java Sida 3

Arv, mer Java Sven-Olof Nyström

Arv: fordonsexempel (forts)

class Bil extends Motorfordon { int motorstyrka;

int antal_hjul;

Bil(int m, int h){

super(m *1.5);

//Antar att toppfarten är motorstyrkan * 1.5

motorstyrka = m;

antal_hjul = h;

} }

(2)

Arv: fordonsexempel (forts)

class Cykel extends Fordon { private Person cyklist;

Cykel (Person p) { cyklist = p;

}

double getToppfart () {

if (cyklist.ålder > 60) return 10;

if (cyklist.ålder > 25) return 20;

return 30; //Larvigt...

} }

OOP m Java Sida 5

Arv, mer Java Sven-Olof Nyström

Arv

Hur kan klasser kan relateras genom arv?

• Arv betyder att en klass ärver implementation av en annan

• Klasserna bör vara konceptuellt relaterade

• Exempel: Fordon -> Motorfordon -> Bil

Rekommendation

Använd arv endast när

• det är lämpligt att ärva implementation, och

• subklassen representerar en delmängd av superklassen

Ofta är det lämpligt att introducera en ny klass som rymmer gemensamma datastrukturer och metoder.

OOP m Java Sida 7

Arv, mer Java Sven-Olof Nyström

Polymorfi

En variabel av klasstyp kan bindas till ett objekt av en subklass.

Exempel:

Fordon f = new Bil();

(3)

Polymorfi...

Utöka klassen fordon med metoderna getToppfart (abstrakt) och beskriv.

abstract class Fordon {

abstract double getToppfart ();

void beskriv () {

System.out.println("Detta fordon har toppfart "

+ getToppfart()+" km/h");

} }

OOP m Java Sida 9

Arv, mer Java Sven-Olof Nyström

Kod för att testa ...

Person p = new Person("Olle", 24);

Cykel c = new Cykel (p);

Bil b = new Bil (100, 4);

System.out.println("Cykel...");

c.beskriv();

System.out.println("Bil...");

b.beskriv();

Fordon f = new Cykel(new Person("Nisse", 99));

System.out.println("Fordon?...");

f.beskriv();

Körexempel

svenolof@harpo$ javac Fordonstest.java svenolof@harpo$ java Fordonstest Cykel...

Detta fordon har toppfart 30.0 km/h Bil...

Detta fordon har toppfart 150.0 km/h Fordon?...

Detta fordon har toppfart 10.0 km/h

OOP m Java Sida 11

Arv, mer Java Sven-Olof Nyström

Typer

Vi talar om typen av en variabel och typen av ett objekt

Typen av en variabel är statisk, givet av programmet och ändras aldrig.

• Ett objekt får en viss typ när det skapas (med new).

Typen ändras aldrig.

(4)

Typkonvertering

• Där ett objekt av klassK förväntas kan man använda ett objekt av en subklass (implicit knvertering)

• Anta: ett objekt av klass K förväntas, vi har en variabel av en superklass, bunden till ett objekt av klass K.

• Vi kan “konvertera” referensen till klassK via explicit typkonvertering.

• Kompilatorn lägger in ett test för att kontrollera att typen är som angetts

OOP m Java Sida 13

Arv, mer Java Sven-Olof Nyström

Typkonvertering, exempel

Bil b = new Bil(...);

Fordon f = b; //OK

Bil b1 = f; //Kompileringsfel Bil b1 = (Bil)f; //OK

Cykel c = (Cykel)f; //Fel vid körning

Vad vi vet om objekt och klasser

• En klass definierar en typ av objekt.

• Varje klass har

– ett antal fält (instansvariabler) – ett antal metoder

– en konstruktor

• Idé: Fälten beskriver den interna representationen.

Metoderna beskriver gränssnittet till omvärlden.

• Allt data är kopplat till ett visst objekt.

OOP m Java Sida 15

Arv, mer Java Sven-Olof Nyström

Vad vi vet (forts)

Frågor:

• Ska ett objekts data (fält) alltid vara tillgängligt utifrån?

• Ibland kan det vara naturligt att låta data leva oberoende av något objekt.

Exempel: Matematiska konstanter, räknare för antalet objekt i en klass, “globala datastrukturer”

• Ibland kan det vara naturligt att kunna använda en metod utan att ha skapat objekt i klassen.

Exempel: Matematiska bibliotek

(5)

Klassvariabler

Exempel:

static int x;

En klassvariabel

• existerar i en version

• allokeras när klassen laddas in

• lever oberoende av om klassen har några objekt

OOP m Java Sida 17

Arv, mer Java Sven-Olof Nyström

Klassvariabler (forts)

class X {

static int counter = 0;

int number;

X () {

counter = counter + 1;

number = counter; }}

Klassvariabler, testkörning

X a = new X();

X b = new X();

X c = new X();

System.out.println(c.number);

Ger variabeln c ordningsnummer 3.

OOP m Java Sida 19

Arv, mer Java Sven-Olof Nyström

Klassvariabler...

Exempel:

En klass Konto med

• klassvariabel ’räntesats’ (gemensam för alla konton)

• instansvariabel ’saldo’ (varje konto har sitt eget saldo!)

(6)

Klassmetoder, exempel

class F {

static double m(double x, double y) { return (x + y) / 2;

} }

Anropet F.m(4.2, 9) ger resultatet 6.6.

• en klassmetod kan anropas även om klassen inte har några objekt

• en klassmetod har tillgång till klassvariabler men inte instansvariabler (varför inte?)

OOP m Java Sida 21

Arv, mer Java Sven-Olof Nyström

Jämför

• klassvariabler — instansvariabler

• klassmetoder — ’vanliga’ metoder

• klassvariabler — globala variabler (i tex C eller Pascal)

• klassmetoder — funktioner i C eller Pascal

Inkapsling och synlighet, modell

public class V { private int x;

public void setX(int x1) { x = x1;

}

public int getX() { return x;

} }

OOP m Java Sida 23

Arv, mer Java Sven-Olof Nyström

Synlighet (forts)

• Vi kan inte komma åt instansvariabeln x direkt:

V v; v.x = ...

är inte tillåtet.

• Men med metoderna setX() och getX() kan värdet på x läsas och skrivas.

• En instansvariabel, klassvariabel eller metod kan deklareras private. Då kan variabeln eller metoden bara användas i klassen.

(7)

Rekommendationer

• Ange alltid synlighet för variabler och metoder.

• Gör alla klass- och instansvariabler private.

OOP m Java Sida 25

Arv, mer Java Sven-Olof Nyström

Lite om paket i Java

• Ett paket (package) är en samling av klasser.

• I Javas standardbibliotek finns paket som System.out, java.io, java,lang, java.applet och java.swing.

• Varje klass har ett enkelt namn (som ges i dess definition), till exempel String, och ett fullständigt namn, till exempel java.lang.String.

Paket (forts)

Man talar om att en viss klass ska ingå i ett visst paket med en deklaration

package mittPaket;

som ska stå först i filen.

Precis som en klass i Java (normalt) definieras i en klass med samma namn, måste alla .class-filer som ingår i ett visst paket finnas i en mapp (directory) med samma namn.

OOP m Java Sida 27

Arv, mer Java Sven-Olof Nyström

Paket i paket

Ett paket kan innehålla andra paket (subpaket).

Ett paket med namnet

mittPaket.ettAnnatPaket

är ett subpaket till paketet mittPaket. Dess klassfiler ska ligga i mappen ettAnnatPaket som i sin tur ska finnas i mappen mittPaket.

(8)

Paket (forts)

För att komma åt en klass i ett visst paket kan man använda klassens fullständiga namn, tex

mittPaket.KlassNamn eller

mittPaket.ettAnnatPaket.KlassNamn

(Klassen KlassNamn kan vara definierad i båda paketen)

OOP m Java Sida 29

Arv, mer Java Sven-Olof Nyström

Paket (forts)

Man kan även importera en viss klass eller ett visst paket, tex

import mittPaket.KlassNamn eller

import mittPaket.ettAnnatPaket.KlassNamn för att importera en viss klass, eller

import mittPaket.* eller

import mittPaket.ettAnnatPaket.*

för att importera alla klasser inom ett visst paket.

Om man importerar två klasser med samma korta namn ger kompilatorn ett felmeddelande.

Paket–synlighet

Om man inte anger synlighet för ett namn kommer namnet att vara synligt för andra klasser inom samma paket.

public paket protec private

Klassen ja ja ja ja

Annan klass (samma p.) ja ja ja nej

Subklass (annat paket) ja nej ja nej

Annan klass (i annat p.) ja nej nej nej

OOP m Java Sida 31

Arv, mer Java Sven-Olof Nyström

Slutgiltiga klasser och metoder

Nyckelordet final betyder

För en variabel: deklarerar att variabeln är konstant.

För en klass: att andra klasser inte kan ärva från den

För en metod: att den inte kan få en ny definition i en subklass

Motivering: Ger effektivare kod. Gör det möjligt för en konstruktör av en klass att styra hur andra bygger vidare på klassen.

(9)

Final: Exempel

class Person { int ålder;

final String namn;

Person (String n, int å) { ålder = å;

namn = n;

}

}

OOP m Java Sida 33

Arv, mer Java Sven-Olof Nyström

Abstrakta klasser

Exempel:

Ett antal klasser för olika geometriska figurer (Circle, Square, Triagle)

Alla definierar en metod draw

För att kunna hantera alla likformigt i ett ritprogram:

definiera en abstrakt klass GeometricShape. Låt alla ärva från denna.

Abstrakt klass: exempel

abstract public class GeometricShape { public GeometricShape( int ix, int iy ) { ... }

protected int x;

protected int y;

abstract public void draw( Graphics g);

public void move( int dx, int dy ) { ... } }

OOP m Java Sida 35

Arv, mer Java Sven-Olof Nyström

Abstrakt klass: exempel (forts)

class Square extends geometricShape { public void draw ( Graphics g ) { ... }}

class Rectangle extends geometricShape { public void draw ( Graphics g ) { ... }}

(10)

Klassen Object

• Java definierar en klass Object

• Varje klass är en subklass till Object

• Object definierar några användbara metoder, tex toString(), getClass(), clone(), equals(..)

• vissa bör definieras om i subklasser Exempel:

Object b = new Person(...);

Person p = (Person) b;

OOP m Java Sida 37

Arv, mer Java Sven-Olof Nyström

Omslagsklasser (Wrapper classes)

Objekt b

Problem: Givet denna deklaration kan b bindas till alla datastrukturer i Java utom de primitiva datatyperna.

Lösning: För varje primitiv datatyp finns en omslagsklass (wrapper class) definierad.

Tex

int - Integer

boolean - Boolean char - Char

Omslagsklasser (forts)

Varje omslagsklass

• har en konstruktor som accepterar motsvarande primitiva datatyp

• definierar en metod för att ta fram värdet, tex intValue().

Integer x = new Integer(42);

int y = x.intValue();

Dito för Boolean, Character, Byte, Double, Float, Long, Short

OOP m Java Sida 39

Arv, mer Java Sven-Olof Nyström

Så, om man har en generell datastruktur för att lagra Objekt kan man lagra de primitiva typerna med hjälp av omslagsklasser

• en viss kostnad; varje instans av en omslagsklass måste lagras på heap och avallokeras av GC

• ganska bökigt, en del kod för att packa in och packa upp.

(11)

Autoboxing/unboxing: Automatisk inpackning och uppackning

Nytt för Java 5 (detta finns ej i Jias bok) int a = 123;

Object x = a;

int y = (Integer) x;

När x tilldelas allokeras ett objekt.

Tips! Se upp för detta. Om man använder

omslagsklasser där primitiva datatyper hade räckt kan koden bli betydligt ineffektivare.

’boolean’ stavas med liten bokstav.

OOP m Java Sida 41

References

Related documents

In Australia for example, about 82% of the introductory programming instructors used an object-oriented language, but only about 37% taught their courses by using an

Vad behöver man vara bra på och vilka egenskaper behöver man ha för att kunna jobba inom det yrket.. Skriv också varför man behöver dessa egenskaper för att vara bra

Om en elev i gymnasieskolan utan giltigt skäl uteblir från den verksamhet som anordnas för att ge den avsedda utbildningen, ska rektorn se till att elevens vårdnadshavare samma

• ett objekt “närvaro”, gemensamt för alla rum, eller. • varje rum har sin

Starttid: 14.02 Färg på nummerlapp: Mgrön

[r]

I vilken ordning traverseras trädet när vi likt b) gör en strängrepresentation av trädet- preorder, inorder eller postorder?.. OBS! Uppgift 9-13 ska enbart lösas av dem som inte skrev

I arbetet med samhällsfrågor kan eleven med viss säkerhet söka, granska och tolka information från olika källor, (redovisa sina källor) samt göra välgrundade reflektioner om