2013-08-23 2 views
20

neu definiert haben Ich bin ein Neuling für Java. Jetzt studiere ich Gleichheit und == und Neudefinition von equals und toString.So drucken Sie die Adresse eines Objekts, wenn Sie die toString-Methode

Ich möchte sowohl die ToString-Methode, die ich neu definiert habe, und die Standardmethode, die von der Object-Klasse geerbt wird.

Ich habe diesen Supermodifikator nicht benutzt, um diese Methode zu erreichen.

Dies ist nur für Bildungszwecke. Was ich gerne sehen möchte, ist klarer, wenn Sie sich die Kommentare in meinem Code anschauen.

Können Sie mir hier helfen?

Mein Code ist:

public class EqualTest{ 
    public static void main(String[] args){ 
     Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15); 
      //System.out.super.println(alice1); 

     Employee alice2 = alice1; 
      //System.out.super.println(alice2); 

     Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15); 
      //System.out.super.println(alice3); 

     System.out.println("alice1==alice2: " + (alice1==alice2)); 
     System.out.println("alice1 == alice3: " + (alice1==alice3)); 
     System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); 
    } 
} 

class Employee{ 
... 
    public String toString(){ 
     return getClass().getName() + "[name = " + name + 
      ", salary=" + salary + ", hireDay=" + hireDay + "]"; 
    } 

} 
+3

Erstens heißt es nicht neu definiert, es heißt Overriding –

+2

Aber die Standardimplementierung gibt die Adresse des Objekts nicht zurück. Es gibt den Klassennamen und den HashCode dieses Objekts zurück. Aus der Dokumentation von java.lang.Object: 'getClass(). GetName() +' @ '+ Integer.toHexString (hashCode())' – Matthias

+0

Nun, ja. Aber der Hash-Code ist die Adresse. Sehen Sie sich die Dokumentation für Object hashCode an: Dies wird normalerweise implementiert, indem die interne Adresse des Objekts in eine Ganzzahl umgewandelt wird, aber diese Implementierungstechnik wird von der JavaTM-Programmiersprache nicht benötigt. Der Hashcode ist also genau die gleiche Hexadezimalzahl, die die Adresse darstellt. Aber es wird in Dezimal umgewandelt. – Kifsif

Antwort

39

Streng genommen Sie nicht die Adresse eines Objekts in Java drucken. Die Nummer, die wie eine Objektadresse in der von Object.toString() erzeugten Zeichenfolge aussieht, ist der "Identitätshashcode" des Objekts. Es kann oder kann nicht auf das Objekt aktuelle Adresse bezogen werden:

  • Die Spezifikationen nicht sagen, wie die Identität hashcode Zahl berechnet wird. Es ist absichtlich nicht spezifiziert.

  • Da die Nummer ein Hashcode ist, kann sie nicht ändern. Auch wenn es (typischerweise) auf eine Objektadresse bezogen ist, ist dies die Adresse des Objekts zu dem Zeitpunkt, zu dem zuerst auf den Hashcode zugegriffen wurde.Dies könnte sich von der aktuellen Adresse unterscheiden, und es wird unterschiedlich sein, wenn der GC das Objekt seit dem ersten Mal verschoben hat, als der Identitäts-Hashcode des Objekts beobachtet wurde.

  • Auf einer 64-Bit-JVM (mit einer ausreichend großen Heap-Größe/ohne komprimierte Ups) passen Adressen nicht in eine Identity-Hashcode-Nummer, die als int zurückgegeben wird.

Wie auch immer, der Weg, um diese Nummer zu bekommen ist System.identityHashCode(obj) anrufen.


Wenn Sie wirklich ein Objekt der aktuellen Adresse möchten, können Sie es JNI erhalten und eine native Methode (und einige Abstraktion Brechen) oder durch Methoden in der Unsafe Klasse. Aber hüte dich davor, dass beide Ansätze nicht portabel sind ... und dass die Objektadressen, die sie dir geben, beim GC-Lauf "kaputtgehen" können.

+0

Bitte schauen Sie hier: http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode() I kann einfach nicht verstehen, warum jeder sagt, dass es keine Adresse ist. Wenn es eine Ganzzahl ist, heißt das nicht, dass es sich nicht um die Adresse handelt. Die Adresse wird in int konvertiert. – Kifsif

+2

@Kifsif - Das heißt nicht, dass es eine Adresse ist. –

+0

Natürlich nicht. Es heißt: "Dies wird typischerweise implementiert, indem die interne Adresse des Objekts in eine ganze Zahl umgewandelt wird, aber diese Implementierungstechnik wird von der Programmiersprache JavaTM nicht benötigt". Typischerweise implementiert bedeutet, dass dies in Oracle JDK so gemacht wird. Liege ich falsch? Selbst wenn ich es bin, weiß niemand, wie Oracle JDK gebaut wird, da es sich um eine geschlossene Software handelt. – Kifsif

0

Sie können auch anrufen super() Methode, um die entsprechenden Ober Methode auszuführen.

class Employee{ 
... 
    public String toString(){ 
     String s = super.toString(); 
     return getClass().getName() + "[name = " + name + 
      ", salary=" + salary + ", hireDay=" + hireDay + "]" + s; 
    } 

toString() in Object ist Klasse als

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 
7

Wenn Sie die Art des Standardverhaltens toString() erreichen möchten, können Sie die Methode System.identityHashCode() verwenden. Standard toString() wird dann wie folgt aussehen:

public String toString(Object o) { 
    return o.getClass().getName() + "@" + 
      Integer.toHexString(System.identityHashCode(o)); 
} 
0

Sie können eine andere Methode in Ihrer Klasse Employee erstellen Super toString Methode zu verwenden.

Siehe Beispiel:

public class Employee { 
    public String toString() { 
     return "MyToStringMethod"; 
    } 

    public String superToString() { 
     return super.toString(); 
    } 

    public static void main(String[] args) { 
     Employee b = new Employee(); 
     System.out.println(b); 
     System.out.println(b.superToString()); 
    } 
} 

oder beides in einem Verfahren kombinieren:

public class Employee { 
    public String toString() { 
     return super.toString() + " MyToStringMethod"; 
    } 

    public static void main(String[] args) { 
     Employee b = new Employee(); 
     System.out.println(b); 
    } 
} 
Verwandte Themen