programmera.net -> java -> normal     för utskrift      info@programmera.net

Klasser

1. Klassen
2. Metoder
3. Medlemsvariabler
4. Lokala variabler
5. Konstruktor

1. Klassen

Klassen är den viktigaste entiteten i ett objektorienterat språk. All programkod i Java placeras i klasser. Nedan visas hur de olika nyckelorden ska placeras i deklarationen av en klass:
[public] [abstract/final] class x [extends y] [implements z]{}
Nedan förklaras nyckelorden:

Nyckelord Beskrivning
public  Klassen är synlig för alla klasser i programmet.
abstract  En abstrakt klass kan inte användas i programmet utom till att ärva ifrån. En klass måste deklareras abstrakt om den har en eller fler abstrakta metoder. Du kan deklarera en klass abstrakt även då den inte har några abstrakta metoder.
final  Denna klass är slutgiltig, man kan inte ärva från den. Klasser som java.lang.String och java.lang.Math är final av säkerhetsskäl
extends  Detta nyckelord används då man vill ärva från en klass. Då du ärver får subklassen automatiskt alla metoder från superklassen (se sidan om arv).
implements  Detta nyckelord innebär att klassen implementerar ett gränssnitt, vanligen genom att ha några specifierade metoder.

En klass innehåller medlemmar, en medlem kan vara en metod (en funktion), konstruktor, variabel eller en klass.

2. Metoder

Det är i klassernas metoder alla operationer sker.

  • I Java går det att överlagra en metod. Två metoder är överlagrade om de har samma samma namn men olika inparametrar. Metoderna a(int) och a(long) är överlagrade. Om två metoders namn och inparametrar är samma säger man att de har samma signatur. Det går inte att deklarera två metoder med samma signatur två gånger i en klass, även om de har olika returtyper. Att överlagra metoder kan vara praktiskt för metoder som t.ex. Math.max(x,y) som returnerar det högsta av två värden. Här vill man att x och y ska kunna vara av typerna long, float eller byte osv.
Nedan visas hur nyckelorden används för att deklarera en metod:
[public/protected/private] [static] [abstract/final]
	[native] [synchronized] y x() [throws z] {}
där y är metodens returtyp, om metoden inte returnerar något används void. Nedan förklaras nyckelorden:

Nyckelord Beskrivning
public  Metoden är synlig för alla klasser i programmet.
protected  Metoden är synlig för alla klasser i paketet, och för subklasser.
private  Metoden är bara synlig inuti klassen.
(inget)  Om ingen av de 3 ovanstående nyckelorden används säger man att metoden har defaultaccess, vilket innebär att metoden är synlig för alla klasser i paketet.
abstract  En abstrakt metod har ingen implementation, ett semikolon ersätter implementationen (se sidan om arv).
static  Denna metod får bara anropa statiska metoder och bara använda statiska medlemsvariabler.
final  En slutgiltig metod kan inte överridas i en subklass (se arv).
native  Denna metod inplementeras i maskinkod, enligt standarden JNI (Java Native Interface).
strictfp  Detta nyckelord bestämmer att alla interna flyttalsberäkningar måste avrundas till 32 resp. 64 bitar. Utan detta nyckelord är det möjligt att operativsystemet använder en högre upplösning i sina interna beräkningar, och resultatet blir plattformsberoende.
synchronized  Endast en tråd i taget kan använda denna metod hos ett objekt (se sidan om trådar).
throws  Denna metod kan kasta ett undantag. Alla anrop till denna metod mäste göras i ett try-catch block (se sidan om undantag).

I följande exempel definieras en klass MyMethods som innehåller några metoder:
class TestMethod{
  public static void main (String[] arg){
    System.out.println("name()="+MyMethods.name());
    MyMethods mm=new MyMethods();
    mm.helloCall();
    System.out.println("visits()="+mm.visits());
  }
}

class MyMethods{
  static final String name() { return "Olle"; }
  private static final void hello() {
    System.out.println("Hello!");
  }
  public void helloCall() { hello(); }
  public int visits() { return 0; }
}

[olle@dev1]$ java TestMethod
name()=Olle
Hello!
visits()=0

3. Medlemsvariabler

Definitionen på en medlemsvariabel är en variabel som deklareras utanför en metod. När man talar om medlemsvariabler brukar man tala om två typer:

  • En instansvariabel är objektets egen variabel. Då ett nytt objekt skapas så skapas alla objektets instansvariabler och initieras eller ges defaultvärden. Dessa variabler finns kvar tills objektet dör.
  • En klassvariabel är en variabel knuten till klassen. Det finns bara ett exemplar av denna variaber som alla objekt delar på. Om variabeln inte är private kan man komma åt den utifrån genom att skriva Klassnamn.variabelnamn utan att gå genom något objekt. En klassvariabel deklareras med static.
Nedan visas hur deklarationen av en medlemsvariabel ska se ut:
[public/protected/private] [static] [final] 
	[transient] [volatile] y x;
Där y är variabelns typ. Nedan förklaras nyckelorden:

Nyckelord Beskrivning
public  Variabeln är synlig för alla klasser i programmet.
protected  Variabeln är synlig för alla klasser i paketet, och för subklasser.
private  Variabeln är bara synlig inuti klassen.
(inget)  Om ingen av de 3 ovanstående nyckelorden används säger man att variabeln har defaultaccess, vilket innebär att den är synlig för alla klasser i paketet.
static  Variabeln är en klassvariabel.
final  Variabelns värde kan inte ändras efter tilldelning. Det är vanligt att man låter slutgiltiga variabler vara klassvariabler, eftersom det är onödigt att det ligger en kopia av samma värde i alla objekt.
transient  Detta värde behöver inte lagras då man kopierar klassen till disk med serialize().
volatile  Signalerar till kompilatorn att variabeln används av flera trådar samtidigt, så kompilatorn får inte ta några genvägar då denna variabel är inblandad.

I detta exempel testar vi att skapa en klass MyVariables innehållande några variabler:
class TestVariable{
  public static void main (String[] arg){
    System.out.println("name="+MyVariables.name);
    MyVariables mv=new MyVariables();
    System.out.println("f="+mv.f);
  }
}

class MyVariables{
  float f;
  private static final int age=3;
  static final String name="Olle";
  private transient int visits=0;
}

[olle@dev1]$ java TestVariable
name=Olle
f=0.0

4. Lokala variabler

En variabel som definieras inuti en metod kallas lokal. Lokala variabler kan bara deklareras med ett nyckelord:

Nyckelord Beskrivning
final  Variabeln går inte att ändras efter den har tilldelats ett värde.

Några detaljer om lokala variabler:

  • En primitiv lokal variabel kan aldrig ses av något annat objekt än det den är skapat av. När man anropar en metod i ett annat objekt med den lokala variabeln som parameter kopieras variabeln till en lokal variabel i det andra objektet.
  • Man behöver inte oroa sig för att någon annan tråd ska fippla med en lokal variabel, eftersom varje tråd har sin egen uppsättning av lokala variabler.
  • En lokal variabel kan bara användas inom det block den har deklarerats. Kompilatorn tillåter inte att du försöker använda en variabel där den inte är synlig.
  • En lokal variabel får inget defaultvärde om den inte tilldelas något. Den är inte ens null utan helt enkelt odefinierad. Kompilatorn tillåter inte användandet av odefinierade variabler.

5. Konstruktor

Då ett objekt skapas med new används en konstruktor. En konstruktor är ett kodblock som används till att initiera objektet:

  • Konstruktorer har samma namn som klassen den skapar ett objekt av (Stor bokstav). Den har inget returvärde.
  • Konstruktorer är ofta överlagrade så att de kan anropas med olika antal argument.
  • Konstruktorer kan anropa varandra inom klassen, men detta måste ske på konstruktorns första rad.
  • Om du inte skriver någon konstruktor till din klass skapar kompilatorn en defaultkonstruktor, som inte gör någonting och inte tar några parametrar.
  • Skapar du en konstruktor så kommer kompilatorn INTE att skapa defaultkonstruktorn, den parameterlösa konstruktorn finns alltså inte längre om du inte gör den själv.
  • En konstruktor kan kasta undantag. Det är det enda sättet man kan få reda på att konstruktorn har misslyckats.
Följande nyckelord kan användas vid deklaration av en konstruktor:

Nyckelord Beskrivning
public  Konstruktorn är synlig för alla klasser i programmet.
protected  Konstruktorn är synlig för alla klasser i paketet, och för subklasser.
private  Konstruktorn är bara synlig inuti klassen.
(inget)  Om ingen av de 3 ovanstående nyckelorden används säger man att konstruktorn har defaultaccess, vilket innebär att konstruktorn är synlig för alla klasser i paketet.

Nedan visas en klass som har konstruktorer:
class TestConstructor{
  public static void main (String[] arg){
    MyClass m1,m2,m3;
    m1=new MyClass();
    m2=new MyClass(6);
    m3=new MyClass(6,9);
    m1.print();
    m2.print();
    m3.print();
  }
}

class MyClass{
  int a=1,b=1,c=1;
  MyClass() {a=2;}
  MyClass(int ain) {a=ain;}
  MyClass(int ain, int bin) {a=ain; b=bin;}
  
  void print(){
    System.out.println(a+" "+b+" "+c);
  }
}
Vi får utskriften:
[olle@dev1]$ java TestConstructor
2 1 1
6 1 1
6 9 1