Sie sind auf Seite 1von 22

Objekte und Klassen

Themen:

 Die Point-Klasse
 Klassenbeschreibungen
 Die toString() Methode
 Daten in einem Objekt ändern vs. ein neues Objekt konstruieren
 Die equals() Methode
 Der == -Operator (noch einmal)
 Aliase

Was ist in der Geometrie ein zweidimensionaler Punkt?

Antwort:

Ein zweidimensionaler Punkt bezeichnet einen Ort im Raum, indem er zwei Werte
verwendet (üblicherweise einen x- und einen y-Wert).

Die Klasse Point

Stellen Sie sich einen


zweidimensionalen Punkt als ein
Objekt vor, das aus zwei Werten
besteht: der Entfernung x vom
Ursprung entlang einer
horizontalen Achse und der
Entfernung y vom Ursprung
entlang einer vertikalen Achse.

Es ist zweckmäßig sich einen


Punkt als "ein Ding" vorzustellen
(und nicht als zwei einzelne
Dinge). Zum Beispiel, Sie
betrachten den Endpunkt einer
Linie als ein Ding. Und Sie
betrachten die Ecke eines Quadrats
als ein Ding. Das ist ein Beispiel
von Abstraktion. In Java wird eine Abstraktion üblicherweise Klasse genannt.

Java besitzt eine Bibliothek vordefinierter Klassen, die für das Erstellen von grafischen
Benutzerschnittstellen verwendet werden. Die Bibliothek wird Application Windowing
Toolkit oder AWT genannt. Eine der vielen Klassen, die in dieser Bibliothek definiert sind,
ist die Klasse Point. Eine Klasse (Sie erinnern sich) ist eine Beschreibung für ein

1
mögliches Objekt. Eine Klassenbibliothek ist eine Sammlung von Plänen, die Ihr
Programm nutzen könnte, wenn es Objekte erzeugt.

Die Klasse Point beschreibt zwei Dinge: die Variablen (die Daten) und die Methoden (das
Verhalten), von Point-Objekten.

Was denken Sie, welche zwei Variablen wird ein Point-Objekt haben?

Antwort:

Ein Point-Objekt besteht aus dem Zahlenpaar (x, y).

Beschreibung einer Klasse

In einem Mathematikbuch wird ein "Punkt" mathematisch präzise definiert. In der


Programmierung wird ebenfalls eine präzise Beschreibung der Klasse Point benötigt. In
den Java Klassenbibliotheken befinden sich die Beschreibungen der einzelnen Klassen.
Die Dokumentation für Point befindet sich im Abschnitt über das AWT. Dort werden Sie
ungefähr folgendes sehen:

public class java.awt.Point

// Felder

int x;

int y;

// Konstruktoren

Point(); // erzeugt ein Point-Objekt bei (0,0)

Point(int x, int y); // erzeugt ein Point-Objekt bei (x,y)

Point( Point pt ); // erzeugt ein Point-Objekt an der Stelle von pt

// Methoden

boolean equals(Object obj); // Überprüft, ob zwei Point-Objekte

// äquivalente Daten enthalten.

void move(int x, int y); // Ändert die (x,y) Daten eines Point-Objekts.

String toString(); // Gibt Character-Daten zurück,


2
// die ausgegeben werden können.

(Ich habe einige Methoden, die wir nicht verwenden, ausgelassen.)

Die Dokumentation zeigt

 die Daten (Variablen), die ein Objekt dieser Klasse enthält,


 die Methoden, die verwendet werden, um diese Daten zu manipulieren, und
 die Konstruktoren, die verwendet werden, um ein Objekt der Klasse zu erzeugen.

Manchmal (wie hier) werden die Variablen auch als Felder bezeichnet. Die zwei
Variablen werden x und y genannt und sind vom Typ int.

FRAGE 3:

Es werden drei Konstruktoren für Point aufgeführt. Jeder erzeugt ein Point-Objekt.
Wodurch unterscheiden sich diese Konstruktoren?

Jeder Konstruktor verlangt vom Benutzer die Bereitstellung von unterschiedlichen Daten.

Multiple Konstruktoren

Jeder der drei Konstruktoren kann verwendet werden, um ein Point-Objekt zu erzeugen.
Es ist eine Frage der Zweckmäßigkeit welchen Konstruktor Sie verwenden. Hier ist ein
Programm, das einige Point-Objekte erzeugt:

import java.awt.*; // Klassenbibliothek importieren,

// in der die Point-Klasse definiert ist.

class PointBsp1

public static void main ( String arg[] )

Point a, b, c; // Referenzvariablen

a = new Point(); // ein Point-Objekt erzeugen bei ( 0, 0);

// Referenz in "a" speichern


3
b = new Point( 12, 45 ); // ein Point-Objekt erzeugen bei ( 12, 45);

// Referenz in "b" speichern

c = new Point( b ); // ein Point-Objekt erzeugen,

// das die gleichen Daten enthält

// wie die, die durch "b" referenziert werden

Damit der Compiler die Definition von Point in der Klassenbibliothek nutzen kann, muss
die import-Anweisung verwendet werden. Die Anweisung import java.awt.* besagt, dass
die AWT-Bibliothek verwendet werden soll, die ein Teil von Java ist. Der "*" sagt aus,
dass alles was in der Bibliothek definiert ist, verwendet werden kann (auch wenn dieses
Programm nur die Klasse Point verwendet).

FRAGE 4:

Angenommen, dass das Programm gerade in den Arbeitsspeicher geladen wurde und
gerade dabei ist zu starten (die Anweisung Point a, b, c; wurde ausgeführt):

Wie viele Referenzvariablen gibt es? 3


Wie viele Objekte gibt es? 0

Instanziieren der Point-Objekte

Hier ist eine Abbildung der Variablen, zum Zeitpunkt an dem das Programm gerade
gestartet worden ist. Es wurden noch keine Objekte instanziiert (erzeugt), so dass die
Referenzvariablen a, b und c noch auf keine Objekte verweisen. Um das zu betonen,
wurden die Objektboxen, die die einzelnen Variablen repräsentieren, mit einem
Schrägstrich dargestellt.

Hier ist noch einmal das Programm:

4
import java.awt.*; // Klassenbibliothek importieren,

// in der die Point-Klasse definiert ist.

class PointBsp1

public static void main ( String arg[] )

Point a, b, c; // Referenzvariablen

a = new Point(); // ein Point-Objekt erzeugen bei ( 0, 0 );

// Referenz in "a" speichern

b = new Point( 12, 45 ); // ein Point-Objekt erzeugen bei ( 12, 45 );

// Referenz in "b" speichern

c = new Point( b ); // ein Point-Objekt erzeugen,

// das die gleichen Daten enthält

// wie die, die durch "b" referenziert werden

Dieses Programm:

1. Deklariert drei Referenzvariablen a, b und c, welche auf Objekte vom Typ Point
verweisen können.
2. Instanziiert ein Point-Objekt mit x=0 und y=0.
Speichert die erste Referenz in der Variablen a.
3. Instanziiert ein weiteres Point-Objekt mit x=12 und y=45.
4. Speichert diese Referenz in der Variablen b.
5. Instanziiert ein drittes Point-Objekt.
6. Speichert diese Referenz in der Variablen c.

Sobald jedes Point-Objekt instanziiert ist, ist es gleich jedem anderen Point-Objekt (mit
Ausnahme der Datenwerte). Es ist egal welcher Konstruktor benutzt wurde, um es zu
instanziieren.

5
FRAGE 5:

Was sind die Werte von x und y des dritten Point-Objekts?

x = 12 und y = 45.

Abbildung der Objekte

Die Point-Objekte b und c wurden mit den Anweisungen

b = new Point( 12, 45 );

c = new Point( b );

konstruiert. Der Konstruktor für dasPoint-Objekt c wird mit den Daten des Point-Objekts
b versorgt. Es erscheint vernünftig, dass x und y von c ihre Werte von b beziehen. (Um
sicher zu gehen, überprüfen Sie die Dokumentation der Klasse Point.)

Nachdem die drei Objekte erzeugt wurden (kurz bevor das Programm endet), sieht die
Situation ungefähr so aus:

Jede Referenzvariable hat ein Objekt, auf das sie verweist. Jedes Objekt enthält seine
eigenen Daten und seine eigenen Methoden (aus Gründen der Übersichtlichkeit werden
nur einige Methoden gezeigt). Ein Objekt enthält keine Konstruktoren (sie werden nur zur
Erzeugung der Objekte verwendet).

FRAGE 6:

Betrachten Sie die Abbildung. Ist es klar, was der Ausdruck "das Objekt a" bedeutet?

Ja, auch wenn der Ausdruck ein bisschen irreführend ist. Man sollte wirklich sagen, "das
Objekt, das durch a referenziert wird", oder "das Objekt, auf das a verweist", aber
Menschen verwenden oft den kürzeren Ausdruck und erwarten, dass Sie wissen was damit
gemeint ist.

Die toString() Methode

Das Beispielprogramm macht sehr wenig, was auf dem Bildschirm sichtbar ist. Es wäre
schön etwas auszugeben. Die Bytes, die ein Objekt ausmachen, können nicht direkt auf
6
den Bildschirm ausgegeben werden, da sie keine ASCII Character-Daten sind. Zum
Beispiel, die zwei int eines Point-Objekts verwenden einen Datentyp, der nicht direkt auf
den Bildschirm ausgegeben werden kann. Natürlich sind die Methoden eines Objekts in
Java Bytecode, was ebenfalls für den Bildschirm keinen Sinn ergibt. Glücklicherweise ist
in der Klasse Point eine Methode definiert, die dazu verwendet werden kann einen
druckbaren String für ein Point-Objekt zu erzeugen.

public String toString(); // gibt Character-Daten zurück,

| | | // die ausgegeben werden können

| | |

| | +--- der Name der Methode, sie braucht keine Parameter

| |

| +--- das sagt, dass die Methode ein String-Objekt zurückgibt

+--- überall, wo Sie ein Point-Objekt haben

können Sie diese Methode verwenden

Die toString() Methode eines Point-Objekts erzeugt ein String-Objekt.

FRAGE 7:

(Rückblick: ) Was ist ein Parameter?

Ein Parameter ist ein Datenelement, mit dem eine Methode oder ein Konstruktor versorgt
wird.

Ein Programm, das die toString() Methode verwendet

Die Dokumentation zeigt toString() mit keinen Parametern innerhalb der Klammern. Das
bedeutet, dass keine Daten an die Methode geliefert werden, wenn Sie sie aufrufen.
Dennoch, die Klammern müssen sein. Hier ist das Beispielprogramm:

import java.awt.*;

class PointBsp2

public static void main ( String arg[] )

{
7
Point a, b, c; // Referenzvariablen

a = new Point(); // ein Point-Objekt erzeugen bei ( 0, 0 );

// Referenz in "a" speichern

b = new Point( 12, 45 ); // ein Point-Objekt erzeugen bei ( 12, 45 );

// Referenz in "b" speichern

c = new Point( b ); // ein Point-Objekt erzeugen

String strA = a.toString(); // ein String-Objekt erzeugen;

// auf der Basis der Daten,

// die in dem Objekt gefunden werden,

// das von "a" referenziert wird

System.out.println( strA );

Wenn das Programm läuft, erzeugt die Anweisung:

String strA = a.toString(); // ein String-Objekt erzeugen auf der Basis der Daten

ein Stringobjekt basierend auf den Daten des Objekts, auf das a verweist. Die
Referenzvariable strA behält die Übersicht über dieses neue Stringobjekt. Dann werden
die Character des Strings mit println auf den Bildschirm ausgegeben. Das Programm gibt
aus:

java.awt.Point[x=0,y=0]

Das Point-Objekt wurde nicht geändert: es existiert noch und wird durch a referenziert.
Seine Methode toString() erzeugte die Character-Zeichen, die ausgegeben wurden, und
speicherte sie in dem Stringobjekt. (Natürlich wollen Sie jetzt unbedingt das Programm
nach Notepad kopieren, es kompilieren und starten. Dann werden Sie
höchstwahrscheinlich das Programm modifizieren und die toString() Methode auf die
beiden anderen Objekte anwenden.)

FRAGE 8:

8
Kurz bevor das Programm endet, wie viele Objekte gibt es und wie viele Objektreferenzen
gibt es? Wurde irgendein Ausschuss erzeugt?

Kurz bevor das Programm endet,


wie viele Objekte gibt es 4
und wie viele Objektreferenzen gibt es? 4
Wurde irgendein Ausschuss erzeugt? Noch nicht.

Ein temporäres Objekt verwenden

Im Beispielprogramm wurde ein Stringobjekt erzeugt und eine Referenz darauf in einer
Referenzvariablen aufgehoben. Das funktioniert, ist aber etwas umständlich. Hier ist eine
weitere Modifikation des Beispielprogramms:

import java.awt.*;

class PointBsp3

public static void main ( String arg[] )

Point a = new Point(); // Deklaration und Konstruktion kombiniert

Point b = new Point( 12, 45 );

Point c = new Point( b );

System.out.println( a.toString() ); // einen temporären String

// basierend auf "a" erzeugen

Dieses Programm erzeugt drei Point-Objekte mit den gleichen Werten wie zuvor, aber
jetzt ist die Deklaration und Konstruktion eines jeden Point-Objekts zusammengefasst.

Die letzte Anweisung hat die gleiche Wirkung wie die zwei letzten Anweisungen des
vorherigen Programms:

1. Wenn die Anweisung ausgeführt wird, verweist a auf ein Objekt mit den Daten (0,0).
2. Die toString() Methode des Objekts wird aufgerufen.
3. Die toString() Methode erzeugt ein Stringobjekt und gibt eine Referenz darauf zurück.
9
4. An dieser Stelle der Ausführung können Sie sich die Anweisung wie folgt vorstellen:

System.out.println( Referenz auf ein Stringobjekt );

5. Die Methode println von System.out verwendet die Referenz, um die Daten zu finden
und sie auf den Bildschirm auszugeben.
6. Die Anweisung ist ausgeführt worden; die Referenz auf das Stringobjekt wurde
nirgendwo gespeichert.

Da die String-Referenz in keiner Referenzvariablen gespeichert wurde, gibt es keine


Möglichkeit das Stringobjekt zu finden. Es ist Ausschuss. Das ist in Ordnung. Es wurde
nur zu einem Zweck gebraucht und der Zweck wurde erfüllt.

Es ist sehr gebräuchlich Objekte auf diese Weise zu verwenden.

Welchen Typ von Parameter (das Zeug innerhalb der Klammern) erwartet die
System.out.println() Methode?

Antwort:

Sie erwartet eine Stringreferenz als Parameter.

Automatischer Aufruf von toString()

Eigentlich kann System.out.println() mit verschiedenen Typen von Parametern umgehen,


einer von ihnen ist eine Stringreferenz. Aber es wurde keine Version von
System.out.println() geschrieben, die eine Point-Referenz nützen könnte. So dass das
folgende nicht aussieht, als ob es funktionieren könnte:

Point a = new Point(); // a ist eine Point-Referenz

System.out.println( a );

+--- sollte eine Stringreferenz sein

Dennoch funktioniert es aus dem folgenden Grund:

Wenn ein Parameter eine Stringreferenz sein sollte, aber stattdessen eine Referenz auf
einen anderen Objekttyp übergeben wird, wird Java die toString() Methode des Objekts
aufrufen, um eine Stringreferenz zu bekommen.

Alle Objekte (jeden Typs) haben eine Methode toString(), obwohl das für manche Objekte
nicht sehr sinnvoll ist.

FRAGE 10:

Die obenstehende println() Methode kann ohne Probleme ausgeführt werden. Bedeutet
das, dass das von a referenzierte Objekt auf den Bildschirm kopiert wird?

10
Antwort:

Nein — ein temporäres Stringobjekt wurde durch die toString() Methode des Objekts
erzeugt und die Zeichen in diesem Objekt wurden durch println() an den Bildschirm
gesendet.

Ein weiteres Beispielprogramm

Hier ist das Beispielprogramm mit einer weiteren Änderung:

import java.awt.*;

class PointBsp3

public static void main ( String arg[] )

Point a = new Point(); // kombinierte Deklaration und Konstruktion

Point b = new Point( 12, 45 );

Point c = new Point( b );

System.out.println( a ); // einen temporären String basierend auf "a"

// erzeugen und ausgeben

System.out.println( b ); // einen temporären String basierend auf "b"

// erzeugen und ausgeben

System.out.println( c ); // einen temporären String basierend auf "c"

// erzeugen und ausgeben

Das Programm gibt aus:

java.awt.Point[x=0,y=0]

java.awt.Point[x=12,y=45]
11
java.awt.Point[x=12,y=45]

Dieses Programm ist trügerisch kurz; seine Ausführung erfordert ziemlich viel Aktivität.

Kurz bevor das Programm endet,


wie viele Objekte sind erzeugt worden 6 — drei Point-Objekte und drei temporäre
Stringobjekte
und wie viele Objektreferenzen gibt es? 3 — jede referenziert ein Point-Objekt
Wurde irgendein Ausschuss erzeugt? 3 Objekte — jedes ein nicht referenziertes
Stringobjekt

Daten eines Point-Objekts ändern

Betrachten Sie noch einmal die Beschreibung der Klasse Point. Eine der Methoden ist:

public void move( int x, int y ) ;

Diese Methode wird verwendet, um die x- und y-Werte innerhalb eines Point-Objekts zu
ändern. Der Zugriffsmodifizierer public bedeutet, dass die Methode in Ihrem Programm
überall verwendet werden kann; void bedeutet, dass sie keinen Wert zurückgibt. Dieser
Teil der Beschreibung

( int x, int y )

besagt, dass Sie bei der Verwendung von move zwei int-Parameter übergeben müssen, die
die neue Position des Point-Objekts enthalten. Ein Parameter ist eine Information, mit der
Sie eine Methode versorgen.

Hier ist das Beispielprogramm, noch einmal geändert:

import java.awt.*;

class PointBsp4

public static void main ( String arg[] )

Point pt = new Point( 12, 45 ); // ein Point-Objekt konstruieren

System.out.println( "Anfangswerte: " + pt );

pt.move( -13, 49 ) ; // x und y des Point-Objekts ändern

System.out.println( "Endwerte: " + pt );


12
}

Hier ist, was es auf den Bildschirm ausgibt:

Anfangswerte: java.awt.Point[x=12,y=45]

Endwerte: java.awt.Point[x=-13,y=49]

Wie viele Point-Objekte wurden durch das Programm erzeugt? 1 — das von pt
referenzierte Objekt
Wie viele temporäre String-Objekte wurden durch das Programm erzeugt? 2 — ein
temporäres String-Ojekt für jedes println()

Ein Objekt, dessen Daten geändert werden

Das Programm ändert die Daten innerhalb eines Point-Objekts, indem es die Methode
move() des Objekts verwendet:

import java.awt.*;

class DatenAendern1

public static void main ( String arg[] )

Point pt = new Point( 12, 45 ); // ein Point-Objekt konstruieren

System.out.println( "Anfangswerte: " + pt );

pt.move( -13, 49 ) ; // x und y des Point-Objekts

// ändern

System.out.println( "Endwerte: " + pt );

Hier ist eine Abbildung davon:

13
Kann ein Konstruktor verwendet werden, um die Daten innerhalb eines Objekts zu
ändern?

Antwort:

Nein. Ein Konstruktor erzeugt immer ein neues Objekt. (Er kann die Daten eines
existierenden Objekts erhalten, aber er wird ein völlig neues Objekt erzeugen, das ein
anderes Stück Arbeitsspeicher verwenden wird.)

Gefährlich ähnliches Programm

Hier ist noch einmal das Beispielprogramm. Es wurde modifiziert, um ein zweites Point-
Objekt zu erzeugen:

import java.awt.*;

class DatenAendern2

public static void main ( String arg[] )

Point pt = new Point( 12, 45 ); // ein Point-Objekt konstruieren

System.out.println( "Anfangswerte: " + pt );

pt = new Point( -13, 49 ) ; // ein neues Point-Objekt konstruieren

System.out.println( "Endwerte: " + pt );

14
}

Hier ist eine Abbildung, die die Situation vor und nach der zweiten Zuweisungsanweisung
zeigt:

In der Abbildung "Nachher" wird das erste Objekt grau dargestellt, um hervorzuheben,
dass es jetzt Ausschuss ist. Die Referenzvariable pt verweist auf das neu erzeugte Objekt.

Genau das gleiche wie die erste Version:

Anfangswerte: java.awt.Point[x=12,y=45]

Endwerte: java.awt.Point[x=-13,y=49]

Rückblick

Sie können sich durch die Begutachtung des Outputs nicht über die internen Abläufe eines
Programms sicher sein!

Sie möchten vielleicht die zwei Programme noch einmal durchsehen, um sicher zu sein,
dass Sie deren Unterschiede verstanden haben:

Was es tat:
Ein Objekt wurde konstruiert. Die Variable pt
Das erste
verweist darauf. Dann ersetzten neue Daten die
Programm
alten Daten innerhalb desselben Objekts.
Ein Objekt wurde konstruiert. Die Variable pt
verweist darauf. Dann wurde ein neues Objekt mit
Das zweite
neuen Daten konstruiert und pt wurde geändert,
Programm
um darauf zu verweisen. Das erste Objekt wurde
Ausschuss.

15
Wie überprüfen Sie, ob zwei Point-Objekte äquivalent sind? (d.h., dass sie die gleiche
Position in einer zweidimensionalen Ebene angeben.)

Antwort:

Der x und y Wert eines jeden Point-Objekte ist der gleiche.

Die equals() Methode

Die equals() Methode der Klasse Point ist definiert, um diesen Test durchzuführen:

pointA.equals( pointB ) ----- gibt wahr zurück, wenn die zwei Point-Objekte

äquivalente Daten enthalten

Hier ist ein Beispielprogramm, das dieses aufzeigt:

import java.awt.*;

class EqualsDemo

public static void main ( String arg[] )

Point pointA = new Point( 7, 99 ); // erstes Point-Objekt

Point pointB = new Point( 7, 99 ); // zweites Point-Objekt

// mit äquivalenten Daten

if ( pointA.equals( pointB ) )

System.out.println

( "Die zwei Objekte enthalten die gleichen Daten: " + pointA );

else

System.out.println

( "Die zwei Objekte sind nicht äquivalent: " + pointA +

" unterscheidet sich von" + pointB);

16
}

Was ist die Ausgabe des Programms? (Sie möchten vielleicht das Programm kopieren-
einfügen-und-starten, um Ihre Antwort zu überprüfen.)

Die zwei Objekte enthalten die gleichen Daten: java.awt.Point[x=7,y=99]

Verschiedene Objekte, äquivalente Daten

Hier ist eine Abbildung, die die Situation aufzeigt. Es gibt zwei Objekte (jedes wurde aus
anderen Speicherbytes konstruiert). Die equals() Methode gibt true zurück, da die Daten
äquivalent sind.

Könnte der == -Operator in diesem Programm verwendet werden, an Stelle der equals()
Methode?

Antwort:

Nein. Der == -Operator überprüft, ob zwei Referenzvariablen auf dasselbe Objekt


verweisen.

Zwei Referenzvariablen testen

Hier ist das Programm, mit Änderungen:

import java.awt.*;

class EqualsDemo2

public static void main ( String arg[] )

Point pointA = new Point( 7, 99 ); // erstes Point-Objekt

Point pointB = new Point( 7, 99 ); // zweites Point-Objekt


17
// mit äquivalenten Daten

if ( pointA == pointB )

System.out.println("Die zwei Variablen verweisen auf dasselbe Objekt");

else

System.out.println("Die zwei Variablen verweisen auf verschiedene Objekte");

Die Abbildung der Situation (nachdem die zwei new-Operatoren ausgeführt wurden) ist
die gleiche wie auf der vorherigen Seite.

FRAGE 18:

Was ist die Ausgabe des Programms?

Die zwei Variablen verweisen auf zwei verschiedene Objekte.

Alias

Es ist möglich zwei (oder mehr) Referenzvariablen zu haben, die auf dasselbe Objekt
verweisen. Hier ist eine Modifikation des Programms, die das tut:

import java.awt.*;

class EqualsDemo3

public static void main ( String arg[] )

Point pointA = new Point( 7, 99 ); // pointA verweist auf ein Point-Objekt

Point pointB = pointA; // pointB verweist auf dasselbe Objekt

if ( pointA == pointB )

System.out.println("Die beiden Variablen verweisen auf dasselbe Objekt");


18
else

System.out.println("Die beiden Variablen verweisen auf verschiedene Objekte");

Nur ein Objekt wurde erzeugt (da es nur einen new-Operator gibt). Die zweite
Anweisung:

Point pointB = pointA;

kopiert die Referenz, die in pointA ist, in die Referenzvariable pointB. Jetzt führen beide
Referenzvariablen zu demselben Objekt.

Alias: Wenn zwei oder mehr Referenzvariablen auf dasselbe Objekt verweisen, wird jede
dieser Variablen als ein Alias bezeichnet.

Was ist die Ausgabe des Programms?

Antwort:

Die beiden Variablen verweisen auf dasselbe Objekt.

Alias-Detektor

Erinnern Sie sich, dass der == -Operator nur Variablen betrachtet. Wenn zwei Variablen
eine Referenz auf dasselbe Objekt enthalten, dann ergibt der Operator true. Stellen Sie
sich den == -Operator als einen Alias-Detektor vor. Hier ist eine Abbildung der
Situation des letzten Beispielprogramms:

(Denkfrage:) Könnte die equals() Methode in diesem Programm für Aliase verwendet
werden?

In diesem Programm, ja. Aber Sie sollten generell den == -Operator verwenden, wenn Sie
auf Gleichheit der Referenzen abfragen.

Äquivalenz von Alias


19
Hier ist (noch einmal!) das Beispielprogramm mit dieser Änderung:

import java.awt.*;

class EqualsDemo4

public static void main ( String arg[] )

Point pointA = new Point( 7, 99 ); // pointA verweist auf ein Point-Objekt

Point pointB = pointA; // pointB verweist auf dasselbe Objekt

if ( pointA.equals( pointB ) )

System.out.println("Die zwei Variablen verweisen auf dasselbe Objekt,");

System.out.println("oder auf verschiedene Objekte mit gleichen Daten.");

else

System.out.println("Die zwei Variablen verweisen auf verschiedene Objekte");

Die Abbildung der Situation ist die gleiche wie zuvor. Aber jetzt wird die equals()
Methode verwendet.

1. Sie verwendet die Referenz von pointA, um x und y von diesem Objekt zu bekommen.
2. Sie verwendet die Referenz von pointB, um x und y von diesem Objekt zu bekommen.
3. Sie bestimmt, dass beide x-Werte gleich sind und das beide y-Werte gleich sind.
4. Sie gibt true zurück.

Die Tatsache, dass das Objekt in Schritt 1 und Schritt 2 dasselbe ist, spielt keine Rolle.
Die x, die überprüft werden, sind die gleichen und die y, die überprüft werden, sind die
gleichen, also ist das Ergebnis wahr.

FRAGE 21:
20
Wenn der == -Operator true zurückgibt, wird dann die equals() Methode true
zurückgeben, immer?

Antwort:

Ja.

Zusammenfassung

Die folgende Tabelle fasst zusammen, durch was Sie sich gerade hindurchgeschlafen
haben.

pointA == pointA.equals( pointB


Code-Bereich
pointB )
Point pointA = new Point( 21, 17
);

Point pointB = new Point( 21, 17 false true


);

Point pointA = new Point( 21, 17


);

Point pointB = new Point( -99, 86 false false


);

Point pointA = new Point( 21, 17


);
true true
Point pointB = pointA;

FRAGE 22:

Wird pointA.equals(pointB) den gleichen true/false-Wert zurückgeben wie


pointB.equals(pointA)?

Ja

21
22