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.