2010-11-17 9 views
10

Ich habe eine Funktion, die ein benutzerdefiniertes Objekt zurückgibt. Zuerst möchte ich wissen, ob dieses Objekt als Referenz zurückgegeben wird und was, wenn es privat ist?Java (Anfänger): Rückgabe eines Objekts? Wird es als konstante Referenz zurückgegeben oder was?

Wie kann ich es auch als Constant (final) referenz zurückgeben, weil ich nicht möchte, dass jemand sich damit anlegt? Ich bin so verwirrt zwischen der Rückgabe eines Objekts und der Rückgabe von object.copy(); oder object.clone();

Antwort

13

In Java geben Sie immer eine Referenz zurück (es sei denn, der zurückgegebene Wert ist ein primitiver Typ wie int, float, char, ...).

Also, wenn Sie das zurückgegebene Objekt nicht wollen, geändert werden, Sie müssen zurückgeben eine vollständige Kopie davon (Sie Clonable Schnittstelle und clone Methode, wenn Ihre Klasse definiert sie verwenden könnte).

+5

... oder das Objekt ist so konzipiert, dass es unveränderlich ist. –

+0

@Michael Borgwardt: großer Punkt. Ich denke, das Hinzufügen der Antwort wird die Person verwirren, die die Frage stellt ... –

+0

ist ein Array, das als Referenz übergeben wird? Soweit ich weiß, ist es ein primitiver Typ, aber es ist veränderlich. – bigblind

1

Es gibt die Referenz des Objekts zurück.

Angenommen, Sie haben einen Methodenaufruf wie.

die ein Objekt erstellt und zurückgibt (was die Referenz des in der makeObject-Methode erstellten Objekts ist).

0

1) Ja, es wird ein Verweis auf das Objekt zurückgegeben.

2) Wenn die Methode privat ist, kann sie nur innerhalb der Klasse selbst aufgerufen werden.

3) Das Erstellen eines Objekts final hindert andere nicht daran, Methoden aufzurufen. Es gibt Möglichkeiten, ein Objekt mithilfe der Sichtbarkeit von Paketen und Methoden unveränderbar zu machen. (Sehen Sie, wie öffentlich, geschützt und private Arbeit)

4) Es gibt keine Object.copy()

5) Object.clone() eine schmutzige Tier ist.

9

Also, um Ihre Fragen zu beantworten, müssen Sie zuerst wissen, wie Java Variablen übergibt.

eine Variable einen Wert hat:

int i = 1234; 
Person p = new Person("Peter"); 

Nun wird die Variable i enthält genau 1234, während die Variable p die Speicher Adresse der Person erstellt enthält.

Also ich enthält 1234 und p enthält die Adresse (sagen wir a4dfi3).

anyMethodYouLike(p); 
System.out.println(p.getName()); 
public void anyMethodYouLike(Person somePerson) { 
    somePerson.rename("Homer"); 
} 

also geben wir in diesem Beispiel die Methode anyMethodYouLike die Variable p ... warten! Wir geben der Methode den Wert der Variablen (a4dfi3). Die Methode ruft dann das Umbenennen für diese Variable auf (die immer noch die gleiche Adresse wie p hat, daher ändert sie dieselbe Person, auf die p zeigt). So wird nach der Methode der Name der Person, auf die p zeigt, gedruckt, was zu "Homer" führt.

someOtherMethod(p); 
System.out.println(p.getName()); 
public void someOtherMethod(Person somePerson) { 
    somePerson = new Person("Walter"); 
} 

In diesem Beispiel geben wir immer noch die Adresse unserer Person namens "Peter" an die Methode. Aber dieses Mal erstellt die Methode eine neue Person in somePerson (also überschreiben Sie die Adresse in etwasPerson zu .. sagen wir 13n37s. ABER!Die Person bei a4dfi3 wurde nicht geändert! Der Druckaufruf gibt immer noch "Peter" und nicht "Walter" aus. Jetzt

, mal sehen, wie dieses Verhalten mit Primitiven:

someMethod(i); 
System.out.println(i); 
public void someMethod(int someInt) { 
    someInt++; 
} 

So wird der Wert von i (1234) wird an someInteger weitergegeben. Dann wird someInteger auf 1235 erhöht. Aber ich bin immer noch 1234.

Dies ist der große Unterschied zwischen Objekten und Primitiven in Java.

Nun zu Ihren Fragen: 1. Wie Sie hier lesen können, übergibt Java immer die Referenzadresse des Objekts. 2. Wenn Sie nicht möchten, dass sich jemand mit den Werten Ihrer Objekte anlegt, müssen Sie zuerst ein neues Objekt mit diesen Informationen erstellen (zB mit Cloneable und clone()), aber es ist ein Chaos, weil Sie es machen müssen sicher, dass alles in Ihrem Objekt, das nicht primitiv ist, neu erstellt wird, was einfach schrecklich ist, wenn Sie riesige Baumstrukturen von Objekten haben.

Ich hoffe ich konnte helfen, Ferdi265

2

Was sollten Sie wirklich erkennen, dass es nichts Besonderes „passing“ oder „Rückkehr“. Immer wenn Sie etwas "weitergeben" oder "zurückgeben", übergibt es einfach den Wert der Sache. Zeitraum. Für jeden Typ. Wann immer Sie etwas "weitergeben" oder "zurückgeben", ist es genau das Gleiche, als wenn Sie es einfach einer Variablen zuweisen.

Jedoch was ist der Wert der Sache, die Sie übergeben oder zurückgeben? Da scheint deine Verwirrung zu liegen. Deine Frage fragt nach "Rückgabe eines Objekts"; Allerdings macht so etwas in Java keinen Sinn. Objekte sind keine Werte in Java. Es ist unmöglich, eine Variable zu haben, deren Wert ein Objekt ist.

Die einzigen Typen in Java sind primitive Typen und Referenztypen. Daher sind die einzigen Werte Primitive und Referenzen. (Referenzen sind Zeiger auf Objekte.) In Java manipulieren wir Objekte nur durch Referenzen (Zeiger auf Objekte). Wir können ein Objekt nicht in einer Variablen speichern; aber wir können eine Referenz (Zeiger auf ein Objekt) in einer Variablen speichern. Wenn Sie also über das Übergeben oder Zurückgeben von Objekten sprechen, sprechen Sie fast sicher davon, Referenzen zu übergeben oder zurückzugeben. Und wie bereits erwähnt, gibt es nichts Besonderes, Referenzen zu übergeben oder zurückzugeben - der Wert der Referenz (ein Zeiger) wird übergeben oder zurückgegeben.

Verwandte Themen