Mer om klasser (Skansholm: Kapitel 3)
Sven-Olof Nyström Uppsala Universitet
17 juni 2005
Objectorienterad programmering Sida 1
Mer om klasser Sven-Olof Nyström
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.
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
Objectorienterad programmering Sida 3
Mer om klasser Sven-Olof Nyström
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
Klassvariabler (forts)
class X {
static int counter = 0;
int number;
X () {
counter = counter + 1;
number = counter; }}
Objectorienterad programmering Sida 5
Mer om klasser Sven-Olof Nyström
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 (Skansholm, sid 92):
En klass Konto med
• klassvariabel ’räntesats’ (gemensam för alla konton)
• instansvariabel ’saldo’ (varje konto har sitt eget saldo!)
Objectorienterad programmering Sida 7
Mer om klasser Sven-Olof Nyström
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?)
Jämför
• klassvariabler — instansvariabler
• klassmetoder — ’vanliga’ metoder
• klassvariabler — globala variabler (i tex C eller Pascal)
• klassmetoder — funktioner i C eller Pascal
Objectorienterad programmering Sida 9
Mer om klasser Sven-Olof Nyström
Inkapsling och synlighet, modell
public class V { private int x;
public void setX(int x1) { x = x1;
}
public int getX() { return x;
} }
• 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.
• Regel: En instansvariabel, klassvariabel eller metod kan deklareras private. Då kan variabeln eller
metoden bara användas i klassen.
• Alternativet, public är default (nästan).
Objectorienterad programmering Sida 11
Mer om klasser Sven-Olof Nyström
Rekommendationer
• Ange alltid synlighet för variabler och metoder.
• Gör alla klass- och instansvariabler private.
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.
Objectorienterad programmering Sida 13
Mer om klasser Sven-Olof Nyström
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.
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.
Objectorienterad programmering Sida 15
Mer om klasser Sven-Olof Nyström
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)
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.
Objectorienterad programmering Sida 17
Mer om klasser Sven-Olof Nyström
Paket–ett (mycket) enkelt exempel
Filen muu/Hej.java package muu;
public void hej(){
System.out.println("Hej hopp");
} }
Paket–ett (mycket) enkelt exempel (forts)
Filen Hoo.java public class Hoo {
static void main(String[] arg){
muu.Hej x = new muu.Hej();
x.hej();
} }
Objectorienterad programmering Sida 19
Mer om klasser Sven-Olof Nyström
Paket–CLASSPATH
Om man har paket på olika platser i filsystemet kan man använda omgivningsvariabeln CLASSPATH (i
operativsystemet) för att tala om var de olika paketen finns.
I Unix kan man skriva
export CLASSPATH=.:/home/svenolof/minaPaket/
för att dels få Javasystemet att söka under nuvarande mapp (’.’) och under min mapp ’minaPaket’ (som förhoppningsvis innehåller mina paket.
Paket–synlighet
Om man inte anger synlighet för en klass som definieras inom ett paket kommer klassen att vara sylig för andra klasser inom samma paket.
På samma sätt: Om man inte anger synlighet för en instansvariablel eller en metod blir den synlig i det paket där klassen definieras.
Objectorienterad programmering Sida 21
Mer om klasser Sven-Olof Nyström
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
Överlagring (overloading) av konstruktorer
En klassdefinition...
class Person { int ålder;
String namn;
[...]
}
Objectorienterad programmering Sida 23
Mer om klasser Sven-Olof Nyström
Java tillåter att en klass har flera konstruktorer.
Person (String n, int å) { ålder = å;
namn = n; }
Person(String n) { ålder = 65;
namn = n; }
Person (int å) { ålder = å;
namn = "Nisse"; }
Person () { ålder = 65;
namn = "Nisse"; }
Objectorienterad programmering Sida 25
Mer om klasser Sven-Olof Nyström
Överlagring av konstruktorer: Exempel Person x;
x = new Person ("Kalle", 42);
System.out.println("Personen "
+ x.namn + " är "
+ x.ålder + " år gammal");
x = new Person (42);
System.out.println("Personen "
+ x.namn + " är "
+ x.ålder + " år gammal");
Exempel: Överlagring (forts) x = new Person ();
System.out.println("Personen "
+ x.namn + " är "
+ x.ålder + " år gammal");
Körexempel
Personen Kalle är 42 år gammal Personen Nisse är 42 år gammal Personen Nisse är 65 år gammal
Objectorienterad programmering Sida 27
Mer om klasser Sven-Olof Nyström
överlagring av metoder class Ut {
static void skriv(String s) {
System.out.println("En sträng:"+ s); }
static void skriv(int x) {
System.out.println("Ett heltal:"+ x); }
static void skriv(double d) {
System.out.println("Ett flyttal:"+ d); }
static void skriv(int [] a) {
System.out.println("En array:"+a); }}
Överlagring av metoder: exempel Ut.skriv(42);
Ut.skriv("eh");
Ut.skriv(3.14);
Ut.skriv( new int[] {5,6,7});
Körexempel:
Ett heltal:42 En sträng:eh Ett flyttal:3.14 En array:[I@73d6a5
Objectorienterad programmering Sida 29