Nichtstatische Felder in Java (Nichtstatische Felder in Java), Lektion, Seite 722544
https://www.purl.org/stefan_ram/pub/nichtstatische_felder_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

Felder (Objektvariablen)

Feld = Objektvariable = Wertespeicher, der in einem Objekt enthalten ist

nicht-statische Objektfelder Ein nicht-statisches Objektfeld ist ein Feld, welches jeweils für jedes einzelne Objekt einer Klasse einmal existiert.

Main.java

public 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

Man beachte die “Field Summary ” in der Dokumentation  der Klasse »java.awt.geom.Point2D.Double«!

Ausgabeanweisung
java.lang.System.out.println( o ); 
Ausgabe
Point2D.Double[ 0.0, 12.0 ]

Diese Ausgabe zeigt sehr schön, daß ein Objekt einer Klasse eine Kombination aus zwei Teilen (hier: »Point2D.Double« und »[ 0.0, 12.0 ]«) ist: Der eine Teil ist die Klasse  des Objektes (hier: »Point2D.Double«), er ist für alle Objekte derselben Klasse gleich, der andere Teil ist der Zustand  des Objekts (hier: »[ 0.0, 12.0 ]«) kann für jedes Objekt individuell verschieden sein. Wenn man die Klasse eines Objektes und seinen Zustand kennt, dann weiß man fast alles, was man über dieses Objekt überhaupt nur wissen kann.

(Der Zustand ist der zeitliche veränderliche Teil eines Objekts.)

Veranschaulichung
.---.---------------.
| x | 0.0 |
'---'---------------'
| y | 12.0 |
'---'---------------'

Die Klasse eines Objekts legt fest, ob dieses Objekt Felder hat, und – wenn ja – welche Felder es besitzt. Mehr dazu findet man dann in der Dokumentation der jeweiligen Klasse.

Ein Typ kann auch in einem anderen Typ enthalten sein. Die Klasse »java.awt.geom.Point2D.Double« ist in dem Typ »java.awt.geom.Point2D« enthalten. Daher ergibt sich der Name »Point2D.Double«.

»final«

Warum kann ein Objekt mehrfach verändert werden (erst »o.y = 14« und dann »o.y = 12«), das in einer Variablen »o« enthalten ist, die mit »final« deklariert wurde?

»final« bedeutet nur, daß eine zweite Zuweisung  an die Variable verboten ist.

Nach »final java.awt.geom.Point2D.Double o = new java.awt.geom.Point2D.Double();« ist also »o = « verboten. Zuweisungen, die mit »o.x =« beginnen, sind jedoch erlaubt, da sich das »final« nur auf die in der Methode »main« enthaltene lokale Variable »o«, aber nicht auf die im Objekt enthaltene Variable »o.x« bezieht.

Die Variable »o.x« ist eine andere Variable als die Variable »o«, und das »final« gilt nur für die Variable »o«. Die Variable »o« enthält ein Objekt, und dieses Objekt enthält eine Variable »x«.

Argumente in Erzeugungsausdrücken

Main.java

public class Main
{ public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double o
= new java.awt.geom.Point2D.Double( 7, 2 );

java.lang.System.out.println( o.x );
java.lang.System.out.println( o.y ); }}

java.lang.System.out
7.0
2.0

Mehrere Objekte

Main.java

public class Main
{ public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double o0 = new java.awt.geom.Point2D.Double();
final java.awt.geom.Point2D.Double o1 = new java.awt.geom.Point2D.Double();

o0.x = 1;
o0.y = 2;
o1.x = 3;
o1.y = 4;

java.lang.System.out.println( o0.x );
java.lang.System.out.println( o0.y );
java.lang.System.out.println( o1.x );
java.lang.System.out.println( o1.y ); }}

java.lang.System.out

1.0

2.0

3.0

4.0

Vergleich von Objekten

Beim Aufruf der Methode »equals(java.lang.Objekt)« wird ein anderes Objekt als Argument übergeben.

Main.java

public class Main
{ public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double o0 = new java.awt.geom.Point2D.Double();
final java.awt.geom.Point2D.Double o1 = new java.awt.geom.Point2D.Double();

o0.x = 1; o0.y = 2;
o1.x = 1; o1.y = 2;

java.lang.System.out.println( o0 );
java.lang.System.out.println( o1 );
java.lang.System.out.println();

java.lang.System.out.println( o0.equals( o0 ));
java.lang.System.out.println( o0.equals( o1 ));
java.lang.System.out.println( o1.equals( o0 ));
java.lang.System.out.println( o1.equals( o1 ));
java.lang.System.out.println();

java.lang.System.out.println( o0 == o0 );
java.lang.System.out.println( o0 == o1 );
java.lang.System.out.println( o1 == o0 );
java.lang.System.out.println( o1 == o1 ); }}

Protokoll
Point2D.Double[1.0, 2.0]
Point2D.Double[1.0, 2.0]

true
true
true
true

true
false
false
true

Die Methode »equals« ergibt, ob ihre beiden Argumentwerte gleichwertige  Objekte sind, während der Operator »==« ergibt, ob seine beiden Operandenwerte gleiche  Objekte sind. Zwei verschiedene  Objekte können als gleichwertig  gelten, wenn ihre Felder gleiche Werte enthalten.

Wenn Objekte als gleich gelten, wenn alle ihre Felder die gleichen Werte haben, so nennen manche dies strukturelle Gleichheit.

Ein Objekt ist im Rahmen der durch die strukturelle Gleichheit gegebenen Sichtweise durch seine Klasse und die Werte aller seiner Felder bestimmt. Wenn man ein Objekt in dieser Weise betrachtet, so nennt man es auch ein Wertobjekt.

Getter und Setter ⃖

Ein Getter  ist eine Wertmethode, die eine bestimmte Information über ein Objekt liefert, während ein Setter, eine Wirkmethode ist, die es erlaubt, ein Objekt zu verändern. Zusammenfassend werden solche Methoden auch als Zugriffsmethoden  bezeichnet, weil sie es erlauben, auf einen gespeicherten Zustand zuzugreifen.

Oft beginnt der Name eines Getters mit »get« und der Name einer Setter-Methode mit »set«.

Hier liefern die Getter-Methoden die Werte aus den Feldern des Objekts, und die Setter-Methode erlaubt es, diesen Zustand einzustellen.

Vereinfachte Proklamationen
double   getX() 
double getY()
void setLocation( double x, double y )
Main.java

public class Main

{ public static void main( final java.lang.String[] args )

{ final java.awt.geom.Point2D.Double point = new java.awt.geom.Point2D.Double();

point.x = 1; point.y = 2;

java.lang.System.out.println( point.x );
java.lang.System.out.println( point.y );
java.lang.System.out.println();

java.lang.System.out.println( point.getX() );
java.lang.System.out.println( point.getY() );
java.lang.System.out.println();

point.setLocation( 6.0, 2.0 );

java.lang.System.out.println( point.x );
java.lang.System.out.println( point.y );
java.lang.System.out.println();

java.lang.System.out.println( point.getX() );
java.lang.System.out.println( point.getY() ); }}

transcript
1.0
2.0

1.0
2.0

6.0
2.0

6.0
2.0

Wenn eine Getter-Methode verwendet wird, um aus einem Feld zu lesen, so kann das Feld dabei nicht versehentlich verändert werden.

Auch bei anderen Methoden als Getter- und Setter-Methoden kann das Verhalten vom Zustand ihres Objekts abhängen.

Methoden aus dem Anwendungsgebiet

Ein Objekt kann neben Felder, Gettern und Settern Methoden enthalten, die jeweils eine Aufgabe erledigen, die durch bestimmte Verwendungen dieses Objektes gekennzeichnet sind. Ein Zahlenpaar wird beispielsweise oft verwendet, um einen Punkt in der Ebene zu kennzeichnen. Man stellt sich also vor, daß Objekte der Klasse »java.awt.geom.Point2D.Double« einen Punkt in der Ebene darstellen („modellieren“).

Entsprechend enthalten java.awt.geom.Point2D.Double-Objekte beispielsweise eine Methode »distance« zur Berechnung des Abstands zu einem anderen Objekt derselben Klasse. Daher wird beim Aufruf der Methode »distance(java.awt.geom.Point2D.Double)« ein (anderes) Objekt derselben Klasse als Argument übergeben.

Vereinfachte Proklamation
double     distance( java.awt.geom.Point2D.Double other ) 
Main.java

public class Main
{ public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double o0 = new java.awt.geom.Point2D.Double();
final java.awt.geom.Point2D.Double o1 = new java.awt.geom.Point2D.Double();

o0.x = 0; o0.y = 3;
o1.x = 4; o1.y = 0;

java.lang.System.out.println( o0.distance( o1 ));
java.lang.System.out.println( o1.distance( o0 )); }}

transcript
5.0
5.0
Analytische Geometrie
   y
^
|
|
|
o0 3.
| '-.
| '-.
| '-. 5
| '-.
| '-.
| '-.
| '-.
| '-.
'-------------------------4-------------->x
o1

Die Wert-Programm-Vereinigung ⃗

Bisher wurde zwischen Werten, wie der Zahl 2, und Programmen, wie dem Programm (der Methode) »println«, unterschieden.

Werte werden von Programmen manipuliert, Werte sind also passiv, Programme (Methoden) sind aktiv.

Ein Objekt vereinigt beide Aspekte:

Es kann passiv, wie ein Wert, mit einem Namen versehen und an andere Programmteile weitergegeben werden.

Andererseits kann es auch durch Aufruf einer seiner Methoden „aktiviert“ werden, es kann wie ein Programm aufgerufen (gestartet) werden und dann wie ein Programm agieren.

Dennoch ist es nicht korrekt zu sagen, daß man „ein Objekt aufrufen kann“ – richtig ist es zu sagen, daß man eine Methode  eines Objekts aufrufen kann.

Werte und Methoden

final java.lang.Object s = "abc";             /* s erscheint als passiver Wertspeicher */
java.lang.System.out.println( s.getClass() ); /* s erscheint als aktiv, Methodenaufruf */

Da Methoden als Teil eines Objektes angesehen werden, können Methoden mit Objekten weitergegeben werden.

Übungsfragen

?   Ausgabe vorhersagen

Welche Ausgabe erzeugt das folgende Programm?
Main.java

public class Main
{

public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double object0 = new java.awt.geom.Point2D.Double();
final java.awt.geom.Point2D.Double object1 = new java.awt.geom.Point2D.Double();
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
{

public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double a = new java.awt.geom.Point2D.Double();
final java.awt.geom.Point2D.Double b = new java.awt.geom.Point2D.Double();
a.x = 1.0;
a.y = 4.0;
java.lang.System.out.println( b.x );
java.lang.System.out.println( b.y ); }}

?   Bedingte Aufgabe ⃗

Diese bedingte Aufgabe richtet sich nur an Kursteilnehmer, die schon den Operator »++« kennen.

Was ist die Ausgabe des folgende Programms?

Main.java

public final class Main
{

public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( new java.awt.geom.Point2D.Double().x++ );
java.lang.System.out.println( new java.awt.geom.Point2D.Double().x++ ); }}

Übungsaufgaben

/   Übungsaufgabe

Schreiben Sie ein Programm, bei dessen Ausführung ein neues Objekt der Klasse »java.awt.geom.Point2D.Double« angelegt wird.

Weisen Sie dem Felde »x« jenes Objektes den Wert »3« und dem Felde »y« den Wert »1« zu.

Geben Sie dann die Werte der beiden Felder »x« und »y« aus.

/   Übungsaufgabe

Schreiben Sie ein Programm, bei dessen Ausführung ein neues Objekt der Klasse »java.awt.geom.Point2D.Double« angelegt wird.

Weisen Sie dem Felde »x« jenes Objektes den Wert »2« und dem Felde »y« den Wert »-8« zu.

Geben Sie dann die Werte der beiden Felder »x« und »y« aus, wobei zum Auslesen der Werte der Felder die Getter-Methoden verwendet werden sollen.

/   Übungsaufgabe

Schreiben Sie ein Programm, bei dessen Ausführung ein neues Objekt der Klasse »java.awt.geom.Point2D.Double« angelegt wird.

Weisen Sie dem Felde »x« jenes Objektes den Wert »17« und dem Felde »y« den Wert »4« zu. Hierzu soll eine Setter-Methode aufgerufen werden.

Geben Sie dann die Werte der beiden Felder »x« und »y« aus, wobei zum Auslesen der Werte der Felder die Getter-Methoden verwendet werden sollen.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722544 stefan_ram:722544 Nichtstatische Felder in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722544, slrprddef722544, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/nichtstatische_felder_java