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.
Arv: Ett exempel Fyra klasser: Fordon Motorfordon Bil Cykel Toppfarten för en cykel beräknas från cyklisten 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; } }
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;
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... } }
Arv Hur kan klasser kan relateras genom arv? Arv betyder att en klass ärver implementat annan Klasserna bör vara konceptuellt relaterade Exempel: Fordon -> Motorfordon -> Bil
Använd arv endast när Rekommendation 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 meto
Polymorfi En variabel av klasstyp kan bindas till ett objek subklass. Exempel: Fordon f = new Bil();
Polymorfi... Utöka klassen fordon med metoderna gettopp (abstrakt) och beskriv. abstract class Fordon { abstract double gettoppfart (); } void beskriv () { System.out.println("Detta fordon har toppf + gettoppfart()+" km/h"); }
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
Typer Vi talar om typen av en variabel och typen av e Typen av en variabel är statisk, givet av pro och ändras aldrig. Ett objekt får en viss typ när det skapas (m Typen ändras aldrig.
Typkonvertering Där ett objekt av klass K förväntas kan ma ett objekt av en subklass (implicit knverteri Anta: ett objekt av klass K förväntas, vi ha variabel av en superklass, bunden till ett ob klass K. Vi kan konvertera referensen till klass K typkonvertering. Kompilatorn lägger in ett test för att kontrol typen är som angetts
Bil b = new Bil(...); Typkonvertering, exempel 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 klass 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 represen Metoderna beskriver gränssnittet till omvär Allt data är kopplat till ett visst objekt.
Vad vi vet (forts) Frågor: Ska ett objekts data (fält) alltid vara tillgäng 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 datastruk Ibland kan det vara naturligt att kunna anvä metod utan att ha skapat objekt i klassen. Exempel: Matematiska bibliotek
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
class X { static int counter = 0; Klassvariabler (forts) 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.
Klassvariabler... Exempel: En klass Konto med klassvariabel räntesats (gemensam för al instansvariabel saldo (varje konto har sitt saldo!)
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 klass några objekt en klassmetod har tillgång till klassvariable instansvariabler (varför inte?)
Jämför klassvariabler instansvariabler klassmetoder vanliga metoder klassvariabler globala variabler (i tex C Pascal) klassmetoder funktioner i C eller Pascal
Inkapsling och synlighet, mod public class V { private int x; public void setx(int x1) { x = x1; } } public int getx() { return x; }
Synlighet (forts) Vi kan inte komma åt instansvariabeln x di V v; v.x =... är inte tillåtet. Men med metoderna setx() och getx() kan x läsas och skrivas. En instansvariabel, klassvariabel eller meto deklareras private. Då kan variabeln eller m bara användas i klassen.
Rekommendationer Ange alltid synlighet för variabler och meto Gör alla klass- och instansvariabler private
Lite om paket i Java Ett paket (package) är en samling av klass I Javas standardbibliotek finns paket som System.out, java.io, java,lang, java.applet o java.swing. Varje klass har ett enkelt namn (som ges i definition), till exempel String, och ett fullst namn, till exempel java.lang.string.
Paket (forts) Man talar om att en viss klass ska ingå i ett vis 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 sa namn.
Paket i paket Ett paket kan innehålla andra paket (subpaket) Ett paket med namnet mittpaket.ettannatpaket är ett subpaket till paketet mittpaket. Dess klas ligga i mappen ettannatpaket som i sin tur ska mappen mittpaket.
Paket (forts) För att komma åt en klass i ett visst paket kan använda klassens fullständiga namn, tex mittpaket.klassnamn eller mittpaket.ettannatpaket.klassnamn (Klassen KlassNamn kan vara definierad i båd
Paket (forts) Man kan även importera en viss klass eller ett 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 pake Om man importerar två klasser med samma ko ger kompilatorn ett felmeddelande.
Paket synlighet Om man inte anger synlighet för ett namn kom namnet att vara synligt för andra klasser inom paket. public paket p Klassen ja ja ja Annan klass (samma p.) ja ja ja Subklass (annat paket) ja nej ja Annan klass (i annat p.) ja nej n
Slutgiltiga klasser och metod Nyckelordet final betyder För en variabel: deklarerar att variabeln är För en klass: att andra klasser inte kan är För en metod: att den inte kan få en ny de subklass Motivering: Ger effektivare kod. Gör det möjlig konstruktör av en klass att styra hur andra byg på klassen.
class Person { int ålder; final String namn; Final: Exempel Person (String n, int å) { ålder = å; namn = n; } }
Abstrakta klasser Exempel: Ett antal klasser för olika geometriska figurer (C Square, Triagle) Alla definierar en metod draw För att kunna hantera alla likformigt i ett ritprog definiera en abstrakt klass GeometricShape. L 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 ) {... }
Abstrakt klass: exempel (fort class Square extends geometricshape { public void draw ( Graphics g ) {... }} class Rectangle extends geometricshape { public void draw ( Graphics g ) {... }}
Klassen Object Java definierar en klass Object Varje klass är en subklass till Object Object definierar några användbara metod tostring(), getclass(), clone(), equals(..) vissa bör definieras om i subklasser Exempel: Object b = new Person(...); Person p = (Person) b;
Objekt b Omslagsklasser (Wrapper class Problem: Givet denna deklaration kan b bindas datastrukturer i Java utom de primitiva datatyp Lösning: För varje primitiv datatyp finns en om (wrapper class) definierad. Tex int - Integer boolean - Boolean char - Char
Varje omslagsklass Omslagsklasser (forts) har en konstruktor som accepterar motsva primitiva datatyp definierar en metod för att ta fram värdet, t intvalue(). Integer x = new Integer(42); int y = x.intvalue(); Dito för Boolean, Character, Byte, Double, Floa Short
Så, om man har en generell datastruktur för at Objekt kan man lagra de primitiva typerna med omslagsklasser en viss kostnad; varje instans av en omsla måste lagras på heap och avallokeras av G ganska bökigt, en del kod för att packa in o upp.
Autoboxing/unboxing: Automa 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ä koden bli betydligt ineffektivare. boolean stavas med liten bokstav.