2012-04-24 4 views
16

Ist es in Java möglich, einen toString für ein Array Objekte zu überschreiben?Ist es in Java möglich, 'toString' für ein Objects-Array zu überschreiben?

Zum Beispiel, ich habe eine einfache Klasse erstellt, User (es ist nicht wirklich wichtig, welche Klasse es ist, da dies eine allgemeine Frage ist). Ist es möglich, dass, sobald der Client ein User[] Array erstellt und der Client System.out.print(array) verwendet, wird die Adresse des Arrays nicht gedruckt, sondern eine benutzerdefinierte toString()?

PS: Natürlich kann ich toString() in meiner Klasse nicht einfach außer Kraft setzen, da es sich um einzelne Instanzen handelt.

+0

So etwas wie 'java.util.Arrays.toString (Array) angepasst haben '. –

+3

Beachten Sie, dass 'Object []. ToString()' ** ** nicht die "Adresse" des Arrays zurückgibt. Es gibt die Arrays [identity hash code] zurück (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode (java.lang.Object)). –

Antwort

17

Nein. Natürlich können Sie eine statische Methode User.toString (Benutzer []) erstellen, aber es wird nicht implizit aufgerufen.

+0

Ich möchte nicht statische Methoden zum Drucken verwenden, ich versuche, die toString() ohne Parameter zu erreichen .. – Popokoko

+6

Verstanden. Deshalb war das erste Wort meiner Antwort "nein". –

4

Sie können eine separate Klasse erstellen, die das Array enthält, und toString() überschreiben.

Ich denke, die einfachste Lösung ist es, die ArrayList Klasse zu erweitern und toString() (zum Beispiel) zu überschreiben.

+1

OP verwendet keine ArrayList, er verwendet ein Array. – EJP

9

Sie können Arrays.toString(Object[] a); verwenden, die die toString() Methode für jedes Objekt im Array nennen.

bearbeiten (von Kommentaren):

Ich verstehe, was Sie erreichen wollen, aber Java nicht, dass zu diesem Zeitpunkt unterstützen.

In Java sind Arrays Objekte, die dynamisch erstellt werden und Variablen des Typs Object zugewiesen werden können. Alle Methoden der Klasse Object können in einem Array aufgerufen werden. Siehe JLS Ch10

Wenn Sie toString() für ein Objekt aufrufen, wird eine Zeichenfolge zurückgegeben, die das Objekt "textuell" darstellt. Da ein Array eine Instanz von Object ist, erhalten Sie nur den Namen der Klasse, den @ und einen Hexadezimalwert. Siehe Object#toString

Die Methode Arrays.toString() gibt das Äquivalent des Arrays als eine Liste zurück, die über jedes Objekt in der Liste iteriert und toString() aufgerufen wird.

So, während Sie System.out.println(userList); nicht tun können, können Sie System.out.println(Arrays.toString(userList); tun, die im Wesentlichen die gleiche Sache erreichen wird.

+0

Ich verstehe immer noch nicht, wie das erreicht, was ich wollte, vorausgesetzt, ich habe eine Klasse, ich möchte, dass diese Klasse toString() für einen Array-Typ "zu unterstützen". Ein Beispiel: Erstellen von Class [] array = new Class [3], sobald die System.out.println (array) ausgeführt wird, wird diese Klasse eine toString() dafür haben. – Popokoko

3

Die einzige Möglichkeit, dies zu tun, besteht darin, Object.toString() neu zu kompilieren und instanceof Klauseln hinzuzufügen.

Ich hatte eine Änderung in Project Coin angefordert, um Arrays objektorientierter zu behandeln. Ich habe das Gefühl, dass es für Anfänger zu viel ist, um alle Funktionen zu lernen, die man in Arrays, Arrays und 7 anderen Hilfsklassen benötigt, die häufig verwendet werden.

Ich denke, am Ende wurde geschlussfolgert, dass Arrays, die richtig objektorientiert sind, eine nicht-triviale Aufgabe sind, die zurück nach Java 9 oder darüber hinaus geschoben wird.

0

Sie können das nicht tun. Wenn Sie ein Array deklarieren, erstellt Java tatsächlich ein verstecktes Objekt vom Typ Array. Es ist eine spezielle Art von Klasse (zum Beispiel unterstützt es den Indexzugriff [] -Operator), auf den normaler Code nicht direkt zugreifen kann.

Wenn Sie toString() überschreiben wollten, müssten Sie diese Klasse erweitern. Aber du kannst es nicht tun, da es versteckt ist.

Ich denke, es ist gut, es so zu sein. Wenn man die Array-Klasse erweitern könnte, könnte man dort alle Arten von Methoden hinzufügen. Und wenn jemand anderen diesen Code verwaltet, sieht er benutzerdefinierte Methoden für Arrays und sie sind "WTF ... Ist das C++ oder was?".

0

Nun, Sie können versuchen, alle Anrufe auf Object.toString mit einem AspectJ um advice zu wickeln und die gewünschte Ausgabe für Arrays zurückgeben. Aber ich glaube nicht, es ist eine gute Lösung :)

2

Versuchen Sie, diese

User[] array = new User[2]; 
System.out.println(Arrays.asList(array)); 

von groben, wenn Sie user.toString() Methode

Verwandte Themen