• No results found

Arv: Ett exempel

N/A
N/A
Protected

Academic year: 2021

Share "Arv: Ett exempel"

Copied!
41
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 definierade för B.

• A är en subklass till B.

• B är en superklass till A.

(2)

Arv: Ett exempel

Fyra klasser:

Fordon

Motorfordon Bil

Cykel

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

(3)

Arv: Fordonsexempel

class Fordon { }

class Motorfordon extends Fordon { private double toppfart;

Motorfordon (double t) { toppfart = t;

}

double getToppfart() { return toppfart;

} }

(4)

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;

} }

(5)

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...

} }

(6)

Arv

Hur kan klasser kan relateras genom arv?

• Arv betyder att en klass ärver implementation annan

• Klasserna bör vara konceptuellt relaterade

• Exempel: Fordon -> Motorfordon -> Bil

(7)

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

rymmer gemensamma datastrukturer och metoder

(8)

Polymorfi

En variabel av klasstyp kan bindas till ett objekt subklass.

Exempel:

Fordon f = new Bil();

(9)

Polymorfi...

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

abstract class Fordon {

abstract double getToppfart ();

void beskriv () {

System.out.println("Detta fordon har toppf + getToppfart()+" km/h");

} }

(10)

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();

(11)

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

(12)

Typer

Vi talar om typen av en variabel och typen av ett

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

• Ett objekt får en viss typ när det skapas (med Typen ändras aldrig.

(13)

Typkonvertering

• Där ett objekt av klass K förväntas kan man ett objekt av en subklass (implicit knvertering)

• Anta: ett objekt av klass K förväntas, vi har

variabel av en superklass, bunden till ett objekt klass K.

• Vi kan “konvertera” referensen till klass K via typkonvertering.

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

(14)

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

(15)

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är

• Allt data är kopplat till ett visst objekt.

(16)

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 le oberoende av något objekt.

Exempel: Matematiska konstanter, räknare

antalet objekt i en klass, “globala datastrukturer”

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

Exempel: Matematiska bibliotek

(17)

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

(18)

Klassvariabler (forts)

class X {

static int counter = 0;

int number;

X () {

counter = counter + 1;

number = counter; }}

(19)

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.

(20)

Klassvariabler...

Exempel:

En klass Konto med

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

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

(21)

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 några objekt

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

(22)

Jämför

• klassvariabler — instansvariabler

• klassmetoder — ’vanliga’ metoder

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

• klassmetoder — funktioner i C eller Pascal

(23)

Inkapsling och synlighet, modell

public class V { private int x;

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

}

public int getX() { return x;

} }

(24)

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 x läsas och skrivas.

• En instansvariabel, klassvariabel eller metod

deklareras private. Då kan variabeln eller metoden bara användas i klassen.

(25)

Rekommendationer

• Ange alltid synlighet för variabler och metoder

• Gör alla klass- och instansvariabler private.

(26)

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

definition), till exempel String, och ett fullständigt namn, till exempel java.lang.String.

(27)

Paket (forts)

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

package mittPaket;

som ska stå först i filen.

Precis som en klass i Java (normalt) definieras med samma namn, måste alla .class-filer som

visst paket finnas i en mapp (directory) med samma namn.

(28)

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 ligga i mappen ettAnnatPaket som i sin tur ska

mappen mittPaket.

(29)

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

(30)

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 kor ger kompilatorn ett felmeddelande.

(31)

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

Klassen ja ja ja

Annan klass (samma p.) ja ja ja Subklass (annat paket) ja nej ja Annan klass (i annat p.) ja nej nej

(32)

Slutgiltiga klasser och metoder

Nyckelordet final betyder

För en variabel: deklarerar att variabeln är

För en klass: att andra klasser inte kan ärv

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

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

(33)

Final: Exempel

class Person { int ålder;

final String namn;

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

namn = n;

} }

(34)

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 ritprog definiera en abstrakt klass GeometricShape. Låt från denna.

(35)

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 ) { ... } }

(36)

Abstrakt klass: exempel (forts)

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

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

(37)

Klassen Object

• Java definierar en klass Object

• Varje klass är en subklass till Object

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

• vissa bör definieras om i subklasser Exempel:

Object b = new Person(...);

Person p = (Person) b;

(38)

Omslagsklasser (Wrapper classes)

Objekt b

Problem: Givet denna deklaration kan b bindas datastrukturer i Java utom de primitiva datatyper

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

Tex

int - Integer

boolean - Boolean char - Char

(39)

Omslagsklasser (forts)

Varje omslagsklass

• har en konstruktor som accepterar motsvar primitiva datatyp

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

Integer x = new Integer(42);

int y = x.intValue();

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

(40)

Så, om man har en generell datastruktur för att Objekt kan man lagra de primitiva typerna med 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 upp.

(41)

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äc koden bli betydligt ineffektivare.

’boolean’ stavas med liten bokstav.

References

Related documents

Meta-categories were derived through amalgamating tags on the basis of their relevance to ‘the broader theoretical and empirical framework’ (Rose, 2001, p.63) of

O m vi anknyter till Anderssons analysmodell så finns det mot bakgrund av d e n n a undersök- ning skäl att påstå att det föreligger faktiska skillnader i värderingar och

Även om lärare i studien påpekat att de äldre eleverna lär sig av de yngre, går det att utläsa av tidigare forskning och denna studie att åldersblandade klassen

Lösningen på att kunna samla underlag och information om varje elev är att ta in eleverna i små grupper vilket är nödvändigt och Lisa som undervisar i engelska förklarar varför:

Paolo Quanta, Ställföreträdande chef för forskning om avancerad aeronautisk teknik i det italienska nationella Forskningsrådet (ita. Consiglio Nazionale delle Ricerche),

Uppsatsförfattarna ser det ändå inte som en svaghet då det förekommer artiklar från flera olika länder som visar på samma resultat, nämligen att taktil massage hjälper

vad man heter leder lustigt nog mina associationer till etnogastronomernas slagord: ”Man ist was man isst.” Individen får ett namn, men namnet gör samtidigt något med henne

psykologiska tillförlitlighet: de kunna ha känt sig tveksamma att kategoriskt desavouera de officiella uppgifterna från Görings presstjänst (det var då ännu ej