Deklarationen nicht-statischer Felder in Java
Durch eine Klassendeklaration können auch die Einträge von Exemplare der zu der Klassendeklaration gehörenden Klasse bestimmt werden. Dazu dürfen diese Einträge nicht mit »static« gekennzeichnet werden.
Objekte und Klassen
Die nicht-statischen Felder einer Klasse werden Bestandteil jedes Objekts jener Klasse.
Die statischen Felder einer Klasse werden nicht Bestandteil eines Objekts jener Klasse.
Die statischen Einträge einer Klasse gelten nicht für die Objekte jener Klasse.
Erinnerung
Wir erinnern an die Klasse »java.awt.geom.Point2D.Double«, deren Exemplare zwei Felder haben.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double o
= new java.awt.geom.Point2D.Double();o.y = 14;
o.y = 12;java.lang.System.out.println( o.x );
java.lang.System.out.println( o.y ); }}java.lang.System.out
0.0
12.0
Ein Objekt mit einem Feld
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public double x;
/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main object = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
java.lang.System.out.println( object.x );
object.x = 1.0;
java.lang.System.out.println( object.x ); }}java.lang.System.out
0.0
1.0
Das Feld wurde ohne »static« deklariert. Es wurde automatisch mit 0.0 initialisiert.
Nicht-statische Felder (also nicht-statische Variablen) einer Klasse existieren zunächst noch nicht. Sie existieren erst in dem Moment, in dem ein Objekt jener Klasse angelegt wird. Dann sind sie sozusagen in diesem Objekt enthalten. Wir nun ein zweites Objekt derselben Klasse angelegt, so enthält dies erneut zu jeder nicht-statischen Variablendeklaration der Klasse eine Variable, aber die Variablen des zweiten Objekts sind nicht dieselben als die des ersten Objekts.
Feldnamen
Namen von Felder, die nicht mit dem Feldmodifizierer "final" deklariert wurden, sollten mit einem kleinen Buchstaben beginnen, weitere Wörter im Namen beginnen dann mit einem großen Buchstaben (camel case, wie beispielsweise der Name "secondsSinceYesterday"). Die Namen sollten Nomen, Nominalphrasen oder Abkürzungen von Nomen sein.
Zwei Objekte mit jeweils einem Feld
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public double x;
/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main object0 = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
final Main object1 = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
java.lang.System.out.println( object0.x );
java.lang.System.out.println( object1.x );
object0.x = 4.0;
object1.x = 6.0;
java.lang.System.out.println( object0.x );
java.lang.System.out.println( object1.x ); }}java.lang.System.out
0.0
0.0
4.0
6.0
Ein Objekt als Verbund zweier Felder
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public double x;
public double y;/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main object = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
object.x = 1.0;
object.y = 2.0;
java.lang.System.out.println( object.x );
java.lang.System.out.println( object.y ); }}java.lang.System.out
1.0
2.0
Initialisierungen von Feldern
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public final double x = 3;
public double y = 8;/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main object = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
java.lang.System.out.println( object.x );
java.lang.System.out.println( object.y ); }}java.lang.System.out
3.0
8.0
Übungsfragen
- ? Ausgabe vorhersagen
- Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public double x;
public double y;/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main object0 = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
final Main object1 = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
object0.x = 1.0;
object1.y = 4.0;
object1.x = 3.0;
object0.y = 2.0;
java.lang.System.out.println( object0.x );
java.lang.System.out.println( object0.y );
java.lang.System.out.println( object1.x );
java.lang.System.out.println( object1.y ); }}- / Ausgabe vorhersagen
- Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public double x;
public double y;/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main a = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
final Main b = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
a.x = 1.0;
a.y = 4.0;
java.lang.System.out.println( b.x );
java.lang.System.out.println( b.y ); }}- ? Ausgabe vorhersagen
- Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public double x;
public double y;/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ final Main a = new Main(); /* Anlegen eines Objekts der "Objektklasse Main" */
final Main b = a;
a.x = 1.0;
a.y = 4.0;
b.x = 2.0;
java.lang.System.out.println( a.x );
java.lang.System.out.println( b.y ); }}
Zusatzaufgabe *
Was ist die Ausgabe des folgende Programms?
- Main.java
public final class Main
{/* Beginn der "Objektklasse Main" mit nicht-statischen Einträgen */
public int i = 3;
/* Beginn der "Verzeichnisklasse Main" mit statischen Einträgen */
public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( new Main().i++ );
java.lang.System.out.println( new Main().i++ ); }}