Kapitel 8. Lokale, objekt- og klassevariable

Indhold:

Forudsættes ikke i resten af bogen.

Forudsætter Kapitel 5, Definition af klasser.

De variabler, vi er stødt på indtil nu, har enten været lokale variabler eller objektvariabler.

Objektvariabler hedder sådan, fordi de bliver oprettet for hvert objekt.

Der findes også variabler, der eksisterer "i klassen", uafhængigt af om der bliver oprettet objekter. Disse kaldes klassevariable og erklæres med nøgleordet static, og de kaldes også statiske variabler.

Herunder ses et eksempel på en klassevariabel og en klassemetode (antalBokse).

Klassevariabler og -metoder vises med understregning i UML-notationen (diagrammet til højre).

Figur 8-1. Java

public class Boks4 
{
  private double længde;              // objektvariabel
  private double bredde;              // objektvariabel
  private double højde;               // objektvariabel
  private static int antalBokse;      // klassevariabel

  public Boks4(double lgd, double b, double h)
  {
    // lgd, b og h er lokale variabler
    længde = lgd;
    bredde = b;
    højde  = h;
    antalBokse = antalBokse + 1;
  }

  public static int læsAntalBokse()   // klassemetode
  {
    return antalBokse;
  }

  public double volumen()
  {
    // vol er en lokal variabel
    double vol;
    vol = længde*bredde*højde;
    return vol; 
  }
}

Variablen antalBokse er en klassevariabel, fordi den er erklæret med static-nøgleordet. Dette betyder, at variablen er tilknyttet klassen, og at alle Boks-objekter deler den samme variabel. Der vil eksistere én og kun én antalBokse-variabel, uanset om der oprettes 0, 1, 2 eller 100 Boks-objekter.

Variablerne bredde, højde og længde er objektvariabler, fordi hvert Boks-objekt har tilknyttet en af hver.

Og for fuldstændighedens skyld: Variablen vol er en lokal variabel, fordi den er erklæret lokalt i volumen-metoden og altså kun eksisterer, når volumen-metoden udføres. Ligeledes med lgd, b og h: De eksisterer kun i Boks' konstruktør.

En klassemetode er en metode, der er erklæret static. Den arbejder på klasseniveau (uafhængigt af om der er skabt nogen objekter) og kan derfor ikke anvende objektvariabler eller -metoder.

Vi kan afprøve Boks4 med:

public class BenytBoks4
{
  public static void main(String args[])
  {
    System.out.println("Antal bokse: "+ Boks4.læsAntalBokse());

    Boks4 boksen;
    boksen = new Boks4(2,5,10);

    System.out.println("Antal bokse: "+ Boks4.læsAntalBokse());

    Boks4 enAndenBoks, enTredjeBoks;
    enAndenBoks = new Boks4(5,5,10);
    enTredjeBoks = new Boks4(7,5,10);

    System.out.println("Antal bokse: "+ Boks4.læsAntalBokse());
  }
}

Resultatet bliver:

Antal bokse: 0
Antal bokse: 1
Antal bokse: 3

Inde fra objektet bruges statiske variabler og metoder ligesom de almindelige variabler og metoder. Det ses f.eks. i Boks' konstruktør:

    antalBokse = antalBokse + 1;

8.1. Eksempler i standardpakkerne

Du har allerede benyttet dig af et par statiske metoder og variabler.

8.1.1. Klassevariable

Der er mange klassevariabler i standardpakkerne. Af de oftest brugte kan nævnes

  • Math.PI - værdien af pi er en klassevariabel i Math-klassen (pakken java.lang).

  • System.out - systemoutputtet er et PrintStream-objekt, der bl.a. har metoderne print() og println(). Objektet er en klassevariabel i System-klassen (pakken java.lang).

  • Color.black - et Color-objekt, der repræsenterer sort. Objektet ligger som en klassevariabel i (selvsamme) Color-klasse (pakken java.awt).

Som det ses, er klassevariabler nyttige til variabler, der er tilgængelige overalt. Det er det nærmeste man kommer globale variabler i Java, som det kendes fra andre programmeringssprog.

8.1.2. Klassemetoder

Af nyttige klassemetoder kan nævnes

  • Matematiske funktioner som Math.random(), Math.sin(double x), Math.cos(double x), Math.sqrt(double x), Math.abs(double x), Math.exp(double x), Math.log(double x), Math.pow(double x, double y), Math.max(double x, double y), Math.min(double x, double y), ...

  • Double.parseDouble(String s) returnerer værdien af s som et kommatal. Nyttig til at fortolke brugerindtastede tal. F.eks. giver Double.parseDouble("3.553") tallet 3.553.

  • Integer.parseInt(String s) returnerer værdien af s som et heltal. F.eks. giver Integer.parseInt("13") tallet 13.

  • String.valueOf(double d) gør det modsatte af Double.parseDouble, den returnerer nemlig en streng, som repræsenterer et flydende kommatal. String.valueOf(3.21) giver altså strengen "3.21". Findes også med int, byte, char etc. som parameter.

  • Character.isDigit(character t) returnerer true eller false afhængigt af om tegnet t er et ciffer. Ligeledes findes Character.isLetter(character t), Character.isLetterOrDigit(character t), Character.isLowerCase(character t), Character.isUpperCase(character t) og Character.isWhitespace(character t). Den sidste undersøger om t er et usynligt tegn, f.eks. mellemrum, linjeskift, tabulator.

  • System.exit() - stopper programudførelsen og afslutter Java.

  • main-metoden, som du selv erklærer, når du skriver et program, f.eks. BenytBoks.main(). Når et program startes, er det altid main, der kaldes. På dette tidspunkt eksisterer der endnu ingen objekter, og main er da også en klassemetode. Der oprettes aldrig nogen BenytBoks-objekter!