68
Klassenvariable

Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Embed Size (px)

Citation preview

Page 1: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Klassenvariable

Page 2: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt, müsste man für jede Kuh und jede Henne den gleichen Literpreis, bzw. den gleichen Eierpreis festlegen. Schreiben Sie ein passendes Programm dazu. Erzeugen Sie mehrere Kühe und Hennen.

Page 3: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Henne{ private String name; private double legeLeistung; private double eierPreis;

public Henne(String pName, double pLegeLeist, double pEierPreis){ name = pName; legeLeistung = pLegeLeist; eierPreis = pEierPreis; }

public void setEierPreis( double pEierPreis){ eierPreis = pEierPreis; }} Dieser Preis gilt für jede Henne

Page 4: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Kuh{ private String name; private double milchLeistung; private double literPreis; public Kuh(String pName, double pMilchLeis, double pLiterPreis){ name = pName; milchLeistung = pMilchLeist; literPreis = pLiterPreis; }

public void setLiterPreis( double pLiterPreis){ literPreis = pLiterPreis; } } Dieser Preis gilt für jede Kuh

Page 5: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public class MainKlassenvar{ public static void main( String[] args){ Kuh k1=new Kuh( "Elsa", 15, 70); Kuh k2=new Kuh( "Frida", 10, 70); Henne h1=new Henne( "Ute", 3, 20); Henne h2=new Henne( "Pute", 5, 20); }}

Dieser Preis gilt für jede Kuh

Dieser Preis gilt für jede Henne

Page 6: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Da es viel Schreibaufwand macht, für jede Kuh den gleichen Literpreis und für jede Henne den gleichen Eierpreis festzulegen, ist es viel sinnvoller, dies mit einer einzigen Anweisung zu machen.Zuerst wird dazu eine sogenannte Klassenvariable definiert. Eine Klassenvariable unterscheidet sich von einem "normalen" Attribut durch den Vorsatz "static".

Page 7: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

In der Klasse Kuh bzw Henne wird deshalb die Klassenvariable "literPreis" bzw. "eierPreis" wie folgt definiert:

private static double literPreis;

private static double eierPreis;

Page 8: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Es gibt zwei Möglichkeiten mit einer Methode auf eine Klassenvariablen zuzugreifen:

1) Mit der "normalen" Methode (Exemplarmethode), die wir bis jetzt kennen gelernt haben.

2) Mit der sogenannten Klassenmethode, die sich von der "normalen" Methode (Exemplarmethode) durch den Vorsatz static unterscheidet. In der Klasse Kuh wird dies also z.B. wie folgt realisiert:

Page 9: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

In der Klasse Kuh wird dies also z.B. wie folgt realisiert:

public static void setLiterPreis( double pLiterPreis){ literPreis = pLiterPreis;}

Page 10: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Eigenschaften der Klassenmethoden:1) Klassenmethoden können nur auf Klassenvariablen zugreifen.  2) Klassenmethoden können nur Klassenmethoden der gleichen Klasse aufrufen.Dagegen haben alle Exemplarmethoden Zugriff auf die Klassenvariablen und Klassenmethoden.

Page 11: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Die Methode main(...) ist immer als static deklariert. Was ist deshalb falsch am folgenden Programm?

Page 12: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); }

public double verdopple( double pWert){ return(2*pWert); }}

main(..) ist immer static, also ... ist main(...) eine Klassenmethode

Da eine Klassenmethode nur auf Klassenmethoden der gleichen Klasse zugreifen kann und main auf die Methode verdopple(...) der gleichen Klasse MainTest1 zugreift, ...

Page 13: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); }

public double verdopple( double pWert){ return(2*pWert); }}

muss verdopple(...) auch eine Klassenmethode werden.

Page 14: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); }

double pWert){ return(2*pWert); }}

Page 15: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); }

public static double verdopple( double pWert){ return(2*pWert); }}

Page 16: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Durch die Benutzung des Klassennamens (und nicht des Namens eines Objekts einer Klasse) wird dann der Literpreis (bzw. Eierpreis) für jedes Objekt einer Klasse festgelegt. In der Klasse Kuh wird dies also z.B. wie folgt realisiert:

Page 17: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Kuh.setLiterpreis(20);setzt für jede Kuh den Preis für ein Liter Milch auf 20 (Cent).Die Methode (hier setLiterpreis ) - nach der Benutzung des Klassennamens - muss dann allerdings eine Klassenmethode sein!

Page 18: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Bemerkung:Hier wird der Bezeichner static immer nach dem Bezeichner für den Zugriffschutz verwendet.Die Bezeichner für den Zugriffschutz und der Bezeichner static können aber auch in der Reihenfolge vertauscht werden. Dies ist dem Kompiler egal Also statt:private static double literpreis;ist auch folgendes möglich:

Page 19: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

static private double literpreis;

Also statt:

ist auch folgendes möglich:

private static double literpreis;

Page 20: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Realisieren Sie das vorige Programm mit

Hilfe von Klassenmethoden und

Klassenvariablen.

Page 21: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Henne{ private String name; private double legeLeistung; private static double eierPreis;

public Henne(String pName, double pEierGewicht){ legeLeistung =pEierGewicht; } public static void setEierPreis( double pEierPreis){ eierPreis=pEierPreis; }}

Warum wird hier eine Klassenmethode implementiert und keine Exemplarmethode?

Kommt gleich (siehe Anweisung in main)

Page 22: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Kuh{ private String name; private double milchLeistung; private static double literPreis; public Kuh(String pName, double pMilchLeistung){ milchLeistung =pMilchLeistung; } public static void setLiterPreis( double pLiterPreis){ literPreis=pLiterPreis; }}

Warum wird hier eine Klassenmethode implementiert und keine Exemplarmethode?

Kommt gleich (siehe Anweisung in main)

Page 23: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public class MainKlassenvar2{ public static void main( String[] args){ Kuh k1 = new Kuh("Elsa", 15); Kuh k2 = new Kuh("Frida", 10); Henne h1 = new Henne("Ute", 3); Henne h2 = new Henne("Pute", 5); Kuh.setLiterPreis(70); Henne.setEierPreis(20); }}

Die Methode (hier setLiterpreis bzw. setEierPreis ) - nach der Benutzung des

Klassennamens - muss eine Klassenmethode sein! (siehe frühere Folie)

Page 24: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Bemerkung

Page 25: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Vorbelegung von Klassenvariablen

Page 26: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Eine Klassenvariable kann - muß aber nicht - bei der Deklaration (mit static) mit

einem Vorgabewert (mit Hilfe des Gleichheitszeichens) initialisiert werden. Wird sie nicht durch einen Vorgabewert initialisiert, wird sie automatisch durch Standardvorbelegungen vorinitialisiert.(gleiche Standardvorbelegungen wie bei

den Attributen einer Klasse). Also ...

Page 27: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Datentyp standardmäßige Vorbelegung

boolean false

char \u0000

byte 0

short 0

int 0

long 0L

float 0.0f

double 0.0

Referenz null

Page 28: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Beispiel

Page 29: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Test { private static int x; private static int y = 2; ...}

x wird mit 0 vorinitialisiert

y wird mit 2 initialisiert

Page 30: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Schreiben Sie ein Programm, in dem (in einer Schleife) z.B. 10 Hennen erzeugt

werden.Danach soll in main(...) die Anzahl der

Hennen auf dem Bildschirm ausgegeben werden. Realisieren Sie dies mit Hilfe

einer entsprechenden Klassenvariablen.Zusätzlich sollen die Hennen (mit 100 beginnend) durchnummeriert werden.

Erstellen Sie danach die Hennen h1 und h2. Geben Sie jeweils alle Attribute auf

dem Bildschirm aus.

Page 31: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

In der folgenden Lösung werden aus Gründen der Vereinfachung ein

paar Attribute und Methoden der Klasse Henne eingespart. Man kann also in diesem

“übertragenen“, “abgespeckten“ Fall von einer “gerupften“ Henne

sprechen:

Page 32: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Um weniger Platz zu verbrauchen schreibt man im Folgenden abkürzend:aus statt System.out.println

Page 33: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Henne{ private String name; private static int hennenAnzahl; private int nummer;

public Henne(String pName){ name = pName; hennenAnzahl++; nummer=hennenAnzahl+100; }

Welchen Anfangswert hat diese Klassenvariable ?

Page 34: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Henne{ private String name; private static int hennenAnzahl; private int nummer;

public Henne(String pName){ name = pName; hennenAnzahl++; nummer=hennenAnzahl+100; }

Da sie nicht explizit (d.h. durch = ) mit einem bestimmten Wert vorinitialisiert wird, wird sie automatisch mit 0

vorbelegt.

Page 35: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

public void setName(String pname){name = pname;

}

public String getName(){ return(name); }

public static int getAnzahl(){ return hennenAnzahl; } public int getNummer(){ return nummer; }}

Page 36: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package hennennummerieren1;public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); }}

Auf welche Hennen kann man am Ende der Schleife zugreifen?

Page 37: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package hennennummerieren1;public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); }}

Nur auf die letzte Henne, weil in h (Pointer) der jeweilige Speicher (genauer die Adresse davon) der vorigen Hennen überschrieben

wurde. Was passiert dann mit den alten Hennen (genauer mit dem zugehörigen Speicherplatz ?)

Page 38: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package hennennummerieren1;public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); }}

Er wird irgendwann von der Java-Müllabfuhr (= Garbage Collector) entsorgt!

Page 39: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package hennennummerieren1;public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); }}

Welchen Wert hat das Attribut nummer von h1 und h2 ?

Page 40: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package hennennummerieren1;public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); }}

h1.nummer = 111 und h2.nummer = 112

Page 41: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Beispiel:Eine Klasse des Java-Systems, d.h.

einer Klasse, die mit der Entwicklungsumgebung

ausgeliefert wird. Diese Klasse heißt:

Page 42: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Math

Page 43: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Die Klasse Math besitzt Klassenmethoden und

Klassenvariablen, wie z.B. die Klassenmethoden:

Page 44: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Liefert eine Zufallszahl zwischen 0 und 1:Math.random()

Die Sinusfunktion:Math.sin(...)

Die Kosinusfunktion:Math.cos(...)

Page 45: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Und die Klassenvariablen(besser Konstanten):

Page 46: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Kreiszahl public static final double PI 3.14...

Eulersche Zahlpublic static final double E 2.71...

Page 47: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Math.PI

bzw.

Math.E

wird dann darauf zugegriffen.

Page 48: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Realisierung eigener Konstanten mit Java

Page 49: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Bemerkungen:Eine Konstante ist eine Variable,

der nur genau einmal ein Wert zugewiesen werden darf.

Sie hat den Bezeichner final.

Page 50: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Eine Konstante kann sich auf ein Objekt beziehen (Objektkonstante),

auf eine ganze Klasse (Klassenkonstante mit static),

auf eine Methode, auf einen formalen Parameter oder

eine lokale Konstante

Page 51: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Zuerst eine einfache Klasse, die wir später noch brauchen:

Page 52: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Hauptstadt{ private String stadtname;

public Hauptstadt(){ } public String getStadtname() { return stadtname; }

public void setStadtname(String stadtname) { this.stadtname = stadtname; }}

Page 53: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Jetzt zu den Konstanten

Page 54: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Objektkonstante: gelten spezifisch für jedes Objekt, das nach dem Bauplan der Klasse angelegt wird.

Page 55: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Welchen Wert hat jede Konstante sinnlos innerhalb jedes Objekts?

123

Wie könnte man dies auch anders realisieren?

Page 56: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Mit einer Klassenkonstanten (ähnlich wie z.B. bei PI, siehe unten)

Da die Konstante sinnlos für jedes Objekt den gleichen Wert hat, ist es nicht besonders sinnvoll, dies durch eine Objektkonstante zu

realisieren.

Page 57: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Hat die Objektkonstante kurs für jedes Objekt den gleichen Wert?

Nein, der spezifische Wert kann durch den Parameter des Konstruktors festgelegt werden.

Page 58: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Hat die Objektkonstante metropole für jedes Objekt den gleichen Wert?

Nein, der spezifische Wert ist ein Verweis auf jeweils ein neues (mit new angelegtes) Objekt.

Page 59: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Die lokale Konstante waehrungskurs verhindert, daß der Wert der Variable waehrungskurs innerhalb der Methode z.B. durch:

waehrungskurs = waehrungskurs *1.19;verändert werden kann.

Page 60: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Die Klassenkonstante PI hat unabhängig von irgendeinem Objekt immer den gleichen Wert 3.14

Deswegen muss kein Objekt erzeugt werden, um diese Konstante verwenden zu können.

Page 61: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class Land{ public final double kurs; public final double sinnlos = 123; public final Hauptstadt metropole = new Hauptstadt(); public Land(final double waehrungskurs){ //waehrungskurs = waehrungskurs *1.19;

this.KURS=waehrungskurs; }}

class Zahlenkonstanten { public static final double PI = 3.14;}

Die Java-Gemeinde schreibt alle Klassenkonstanten durchgehend groß. Über die Schreibweise aller anderen Konstanten gibt es keine

einheitliche Regelung (dem Compiler ist das sowieso alles egal).

Page 62: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package konstante2;public class StartklasseKonstante2 { public static void main(String[] args) { final int kl1 = 10; System.out.println("lokaleKonst.="+kl1); System.out.println("Klassenkonstante PI= " +ZahlenKonstanten.PI);

Land holland=new Land(12.0); System.out.println("lokaleKonstante= " +holland.KURS); }} Was wird auf dem Bildschirm ausgegeben?

Page 63: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

package konstante2;public class StartklasseKonstante2 { public static void main(String[] args) { final int kl1 = 10; System.out.println("lokaleKonst.="+kl1); System.out.println("Klassenkonstante PI= " +ZahlenKonstanten.PI);

Land holland=new Land(12.0); System.out.println("lokaleKonstante= " +holland.KURS); }}

lokaleKonst.=10Klassenkonstante PI=3.14lokaleKonstante=12.0

Page 64: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

Wenn man z.B. zwei Konstanten wie SCHWARZ und WEISS durch die Zahlen

1 bzw. 2 definiert, dann könnte ein Programmierer im Programm z.B. statt

dieser Konstanten SCHWARZ bzw. WEISS die Zahlen 1 und 2 verwenden.

Wenn er kein gutes Gedächtnis hat, führt dies zu Verwechslungen (er könnte auch

noch andere Zahlen wie z.B. 5 probieren..) Will man dies ausschließen, kann man

dies wie folgt erreichen:

Page 65: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class FarbKonstanten{ public static final FarbKonstanten WEISS = new FarbKonstanten(); public static final FarbKonstanten SCHWARZ = new FarbKonstanten();

private FarbKonstanten(){ }}

Warum sollen dies die einzigen zugelassenen Farben sein?Ein Programmierer könnte nach dem Klassenplan wie folgt neue

Farben basteln...

Page 66: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class FarbKonstanten{ public static final FarbKonstanten WEISS = new FarbKonstanten(); public static final FarbKonstanten SCHWARZ = new FarbKonstanten();

private FarbKonstanten(){ }}

class Startklasse{ public static final FarbKonstanten ROT = new FarbKonstanten(); public static void main(String[] args) { final FarbKonstanten BLAU = new FarbKonstanten(); }}

Warum geht dies nicht? (Compiler meckert!)

Page 67: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class FarbKonstanten{ public static final FarbKonstanten WEISS = new FarbKonstanten(); public static final FarbKonstanten SCHWARZ = new FarbKonstanten();

private FarbKonstanten(){ }}

class Startklasse{ public static final FarbKonstanten ROT = new FarbKonstanten(); public static void main(String[] args) { final FarbKonstanten BLAU = new FarbKonstanten(); }}

Dies geht aber nicht, da der Konstruktor private ist !

Page 68: Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,

class FarbKonstanten{ public static final FarbKonstanten WEISS = new FarbKonstanten(); public static final FarbKonstanten SCHWARZ = new FarbKonstanten();

private FarbKonstanten(){ }}

class Startklasse{ public static final FarbKonstanten ROT = new FarbKonstanten(); public static void main(String[] args) { final FarbKonstanten BLAU = new FarbKonstanten(); }}

Dies geht aber nicht, da der Konstruktor private ist !