Indhold:
Klassevariable
Repetition af objektvariabler og lokale variabler
Rekursion
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).
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;
Du har allerede benyttet dig af et par statiske metoder og variabler.
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.
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!