Klassenvariable.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Kapselung , toString , equals , Java API
Java: Objektorientierte Programmierung
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
Vererbung.
Abstrakte Klassen.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Ein Beispiel in Java.
Erweiterte Zuweisungskompatibilität
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,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
ARRAY oder FELD oder VEKTOR
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Programmieren mit JAVA
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
Zusammenfassung Vorwoche
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Objektorientiertes Konstruieren
EPROG Tutorium #3 Philipp Effenberger
Programmiervorkurs WS 2014/15 Instanzmethoden
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 7. Vorlesung WS 2002/2003.
Objektorientierte Programmierung (OOP)
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Konstruktoren.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Hello World! Javakurs 2013 Arne Kappen
ARRAY oder FELD oder VEKTOR
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Grundkurs Informatik 11-13
Vererbung.
SS 04 Christiane Rauh Christian Hellinger
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
2. Vererbung und Kapselung
Definition Felder Konstruktor Methoden Beispiel
1. Die rekursive Datenstruktur Liste 1
9. Vererbung und Polymorphie
Implementieren von Klassen
Statische und Nichtstatische Methoden Properties / Eigenschaften
Datentyp- umwandlung.
 Präsentation transkript:

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, 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.

Dieser Preis gilt für jede Henne 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( Dieser Preis gilt für jede Henne

Dieser Preis gilt für jede Kuh 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( Dieser Preis gilt für jede Kuh

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

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".

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

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:

In der Klasse Kuh wird dies also z.B. wie folgt realisiert: public static void setLiterPreis( double pLiterPreis){ literPreis = pLiterPreis; }

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.

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

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, ...

muss verdopple(...) auch eine Klassenmethode werden. 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.

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

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);

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:

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!

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:

static private double literpreis; Also statt: private static double literpreis; ist auch folgendes möglich: static private double literpreis;

Realisieren Sie das vorige Programm mit Hilfe von Klassenmethoden und Klassenvariablen.

private double legeLeistung; private static double eierPreis; 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)

private double milchLeistung; private static double literPreis; 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)

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)

Bemerkung 1

In einem UML werden Klassenvariablen und Klassenmethoden unterstrichen dargestellt. Beispiel siehe nächste Folie

Kuh ... - literPreis: double + setLiterPreis(lp:double) unterstrichen

Bemerkung 2

Vorbelegung von Klassenvariablen

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 ...

standardmäßige Vorbelegung Datentyp standardmäßige Vorbelegung boolean false char \u0000 byte short int long 0L float 0.0f double 0.0 Referenz null

Beispiel

class Test { private static int x; private static int y = 2; ... } x wird mit 0 vorinitialisiert y wird mit 2 initialisiert

Schreiben Sie ein Programm, in dem (in einer Schleife) z. B 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 von h1 und h2 auf dem Bildschirm aus.

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:

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

Welchen Anfangswert hat diese Klassenvariable ? 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 ?

private static int hennenAnzahl; private int nummer; 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.

public void setName(String pname){ name = pname; } public String getName(){ return(name); public static int getAnzahl(){ return hennenAnzahl; public int getNummer(){ return nummer;

Auf welche Hennen kann man am Ende der Schleife zugreifen? 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?

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 ?)

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!

Welchen Wert hat das Attribut nummer von h1 und h2 ? 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 ?

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

Beispiel: Eine Klasse des Java-Systems, d. h Beispiel: Eine Klasse des Java-Systems, d.h. einer Klasse, die mit der Entwicklungsumgebung ausgeliefert wird. Diese Klasse heißt:

Math

Die Klasse Math besitzt Klassenmethoden und Klassenvariablen, wie z. B Die Klasse Math besitzt Klassenmethoden und Klassenvariablen, wie z.B. die Klassenmethoden:

Liefert eine Zufallszahl zwischen 0 und 1: Math Liefert eine Zufallszahl zwischen 0 und 1: Math.random() Die Sinusfunktion: Math.sin(...) Die Kosinusfunktion: Math.cos(...)

Und die Klassenvariablen (besser Konstanten):

Kreiszahl  public static final double PI 3. 14 Kreiszahl  public static final double PI 3.14... Eulersche Zahl public static final double E 2.71...

Math.PI bzw. Math.E wird dann darauf zugegriffen.

Realisierung eigener Konstanten mit Java

Bemerkungen: Eine Konstante ist eine Variable, der nur genau einmal ein Wert zugewiesen werden darf. Sie hat den Bezeichner final. Vergleich: Eine CD, die nur genau einmal beschrieben werden kann.

Eine Konstante kann man als eine schreibgeschützte Variable auffassen Eine Konstante kann man als eine schreibgeschützte Variable auffassen. (Deswegen ist sie im eigentlichen Sinne des Worts keine Variable mehr).

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

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

class Hauptstadt{ private String stadtname; public Hauptstadt(){ } public String getStadtname() { return stadtname; } public void setStadtname(String stadtname) { this.stadtname = stadtname; } }

Jetzt zu den Konstanten

Objektkonstante: gelten spezifisch für jedes Objekt, das nach dem Bauplan der Klasse angelegt wird. 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? 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?

Mit einer Klassenkonstanten (ähnlich wie z.B. bei PI, siehe unten) 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.

Hat die Objektkonstante kurs für jedes Objekt den gleichen Wert? 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.

Hat die Objektkonstante metropole für jedes Objekt den gleichen Wert? 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.

waehrungskurs = waehrungskurs *1.19; 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.

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.

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).

Was wird auf dem Bildschirm ausgegeben? 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?

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.=10 Klassenkonstante PI=3.14 lokaleKonstante=12.0

Gleich etwas zum Nachdenken ... (Tipp: An die Konstruktoren denken)

Der Konstruktor sieht dann so aus: class Land{ public final double kurs=0; public Land(final double waehrungskurs){ this.kurs=waehrungskurs; } } Weil der Compiler die Initialisierung des Attributs kurs EIGENMÄCHTIG in den Konstruktor (als 1. Zeile) einfügt. Der Konstruktor sieht dann so aus: Warum beklagt sich hier der Compiler?

Der Konstruktor sieht dann so aus: class Land{ public final double kurs=0; public Land(final double waehrungskurs){ this.kurs=waehrungskurs; } } Weil der Compiler die Initialisierung des Attributs kurs EIGENMÄCHTIG in den Konstruktor (als 1. Zeile) einfügt. Der Konstruktor sieht dann so aus: Warum gibt es jetzt Probleme im Konstruktor? Warum beklagt sich hier der Compiler? public Land(final double waehrungskurs){ this.kurs=0; this.kurs=waehrungskurs; Obwohl das Attribut eine Konstante ist (und damit nur einmal beschrieben werden darf) wird jetzt versucht, es zweimal zu beschreiben.

Ein weiterer Vorteil von Konstanten ...

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:

Warum sollen dies die einzigen zugelassenen Farben sein? 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...

Warum geht dies nicht? (Compiler meckert!) 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!)

Dies geht aber nicht, da der Konstruktor private ist ! 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 !

Dies geht aber nicht, da der Konstruktor private ist ! 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 !