Anonyme Klassen

Status
Nicht offen für weitere Antworten.

siba

Bekanntes Mitglied
Hallo!

Warum erhalte ich bei untenstehender anonymer Klasse, nicht null als Ergebnis, sondern java.lang.Object@130c19b?

Code:
System.out.println(new Object());
 

AlArenal

Top Contributor
ibs hat gesagt.:
Hallo!

Warum erhalte ich bei untenstehender anonymer Klasse, nicht null als Ergebnis, sondern java.lang.Object@130c19b?

Code:
System.out.println(new Object());

Weil da nicht

Code:
System.out.println(null);

steht. Und was soll das mit anonymen Klassen zu tun haben?
 

byte

Top Contributor
1. Wo ist das eine anonyme Klasse?
2. Warum sollte da irgendwo null rauskommen?

"java.lang.Object@130c19b" ist die String Repräsentation des Objekts, das durch new Object() erzeugt wird.
 

siba

Bekanntes Mitglied
also new Object() ist meiner Meinung nach eine anonymen Klasse, oder hat die einen Namen? Und ich dachte immer Objekte werden mit Ihrem Standardwert, also null, initialisiert, wenn man ihr keinen Wert zuweißt?
 
S

SlaterB

Gast
Object ist eine vorgegebene Klasse mit einem Namen wie man sieht,
genau wie String oder Integer, nur eben bisschen höher in der Hierarchie,

eine anonyme Klasse kriegst du z.B. mit
Code:
System.out.println(new Object() { });
die dann aber auch sehr wohl einen Namen hat

--------------------
Code:
     System.out.println(new Object() {
            public String toString() {
                return null;
            }
            
        });

führt anscheinend zu einer Exception

----------------
Code:
      System.out.println(new Object() {
            public String toString() {
                return "null";
            }
            
        });
gibt aber "null" aus falls dich das freut ;)
 

siba

Bekanntes Mitglied
:D Vielen Dank für Eure Hilfe! Das mit der anonymen Klasse war gar nicht so mein Problem. Mein Problem war eher, warum dieses Objekt nicht mit null initialisiert wird! :) :wink: Ich wollte es eigentlich nur verstehen! Es muß keine null rauskommen! Weil unerwarteter Weise irgendwelche Hyroglyphen auftauchten :D !
 
S

SlaterB

Gast
du verwechselst das vielleicht mit

public Object o; als Exemparvariable,

eine so DEKLARIERTE VARIABLEe wird mit null initialisiert,
System.out.println(o) führt dann auch zur Ausgabe null,

aber in deinem Beispiel gehts ja gar nicht um Variablendeklaration,
eine Variable tritt da gar nicht auf (höchstens eine anonyme, namenlose Variable ;) )

stattdessen wird ein Objekt erzeugt, ob nun von der Klasse Objekt oder von einer anderen Klasse,
und wenn ein Objekt erzeugt wird, dann ist das logischerweise nicht null,

null als Objekt kriegt man nur wenn man auch explizit 'null' sagt,
einer Variablen kann man dagegen nicht ansehen was sie enthält, da kann auch null drinstecken, insbesondere ganz am Anfang

ein Objekt kann nicht initialisiert werden, entweder es ist da oder nicht
 

SnooP

Top Contributor
naja genauer handelt es sich um die hexadezimale form des hashcodes des objekts:

Code:
public String toString() {
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Das ist die toString() Methode von Object... - die Ausgabe ist insb. beim Debuggen sinnig, um zu gucken, wann welche Objekte tatsächlich identisch sind und wo die identischen Objekte überall so auftauchen.. da nie zwei Objekte die gleiche Identifikationsnummer haben können.
 

Leroy42

Top Contributor
:shock:

Und da habe ich irgendwann mal gelesen, das wär die Adresse und
das jahrelang geglaubt? :autsch:
 
R

Roar

Gast
hashCode() von Object liefert ja auch die speicheradresse zurück ..
 

siba

Bekanntes Mitglied
Habe ich das jetzt richtig verstanden, "java.lang.Object@130c19b" ist der HashCode meines Objektes Object?
 

Leroy42

Top Contributor
Naja, da habe ich bei dir ja auch einen Fehler entdeckt. :bae:

SnooP hat gesagt.:
da nie zwei Objekte die gleiche Identifikationsnummer haben können.

Daß stimmt nicht, da die hash-Funktionen nicht eineindeutig sind.

Auch verbietet es niemand folgendes zu schreiben:
Code:
public class Test {
	public static void main(String[] args) {
		class C extends Object {public int hashCode() {return 42;}}
		System.out.println(new C());
		System.out.println(new C());
	}
}
 

muckelzwerg

Bekanntes Mitglied
Wieso können zwei Objekte den gleichen Hash erhalten ?
Klar kann beim ersten ermitteln ein bereits vergebener hash rauskommen,
aber damit ist ja das Hashing nicht beendet.
Java Hashmaps und andere Container können das doch auch.
(anderen Hash ermitteln bzw Tabelle vergrößern)

-- -- muckelzwerg
 

Wildcard

Top Contributor
muckelzwerg hat gesagt.:
Wieso können zwei Objekte den gleichen Hash erhalten ?
Jedes Objekt errechnet seinen Hash selbst und kennt die anderen Objekte nicht.
Daher können natürlich 2 Objekte den selben Hash haben.
 

byte

Top Contributor
muckelzwerg hat gesagt.:
Wieso können zwei Objekte den gleichen Hash erhalten ?

Diese Frage sollte sich eigentlich nicht stellen, wenn man weiss, wie Hashfunktionen solche Hash-Werte berechnen:

http://de.wikipedia.org/wiki/Hash-Funktion

Bei einer Hash-Funktion geht es allgemein darum, eine lange Eingabe (zum Beispiel einen Text) in eine kurze Ausgabe (den Hash-Wert des Textes) zu verwandeln.

Daraus lässt sich schon schließen, dass es zu Kollisionen kommen kann, also dass mehrere Eingaben zur selben Ausgabe führen können.
 

muckelzwerg

Bekanntes Mitglied
@ Wildcard: Wieso muss man die Objekte dafür kennen ?
Kannst Du das mal etwas ausführen ?

@ byto: Ich weiß, dass es bei Hashfunktionen zu Kollisionen kommen kann.(ist zwar ein paar Jahre her, dass ich welche geschrieben habe,
aber alles vergisst man ja nun auch nicht)
Ja nach Verfahren müssen die dann aufgelöst werden.
Aber ich rede doch gar nicht davon, dass es beim Hashing zu gleichen Werten kommt.
Ich sagte "Objekte", und das meinte ich auch.
Mir geht es darum, wie java mit dem Zeug arbeitet, und nicht um eine Nachhilfestunde über Hashing.
Ich dachte hier kann vielleicht jemand den Mechanismus den java da anwendet erklären, oder einen passenden Link zur Verfügung stellen.

-- -- muckelzwerg
 

SnooP

Top Contributor
Ich versteh das Problem nicht... die Methode hashcode besitzt jedes Objekt - sofern diese nicht überschrieben wird bzw. zumindest die Klasse Object selbst generiert einen hashwert der möglichst einzigartig ist. Das garantiert natürlich nicht, dass nicht doch ein zweites Objekt genau den gleichen hashwert erzeugt, daher können auch zwei Objekte den gleichen hashwert haben.
Hat jemand nen Wahrscheinlichkeitswert dafür? ;) .. die hashcode Methode selbst ist im übrigen native - so kann man also nicht mal schnell nachgucken, wie genau diese implementiert wurde ;)
 

Wildcard

Top Contributor
muckelzwerg hat gesagt.:
@ Wildcard: Wieso muss man die Objekte dafür kennen ?
Kannst Du das mal etwas ausführen ?
Wenn jedes Objekt seinen eigenen Hash berechnet und die anderen Objekte nicht kennt, wie sollte dann eine Kollisionsprüfung stattfinden? Das Objekt kenn ja nur den eigenen Hashwert.
Daher kann ein Hash auch nicht eindeutig sein.
 

byte

Top Contributor
muckelzwerg hat gesagt.:
Mir geht es darum, wie java mit dem Zeug arbeitet, und nicht um eine Nachhilfestunde über Hashing.

Kein Grund gleich patzig zu werden... :roll:

Roar hat glaub ich schon gesagt, wie die hashCode() in Object arbeitet. Sie liefert einfach die interne Speicheradresse des Objekts zurück. Somit können natürlich erstmal zwei Objekte nicht den gleichen "HashCode" haben. Wenn da nicht der böse GC wäre, der Objekte auch mal verschiebt. Dadurch ändert sich die Speicheradresse des Objekts. Wenn Du also Objekte als Keys in einem Hashtable aufnimmst, dann kann es dadurch zu Problemen kommen aufgrund der Kollisionen. Ähnliche Probleme hast Du bei Sets, denn die benutzen die equals() (welche wiederum hashCode() verwendet) um zu gucken, ob ein gleiches Objekt schon in der Menge steht.

Die hashCode() von String arbeitet übrigens anders. Bei langen Strings werden dann einfach nur alle x Zeichen betrachtet, der Rest fliegt raus. Und dann wird das ganze irgendwie noch multipliziert, weil das irgendwie die Gefahr der Kollisionen senkt.
 

muckelzwerg

Bekanntes Mitglied
byto hat gesagt.:
Kein Grund gleich patzig zu werden... :roll:
War auch nicht so gedacht.

Soweit mir bekannt, ist die einzige Möglichkeit gleiche Hashwerte zu erhalten,
wenn man eine Architektur einsetzt, deren Speicherbereich sich nicht mit einem Integer abbilden lässt.
Das die GC da Problem macht wusste/weiß ich nicht.

Bei den Hashmaps etc. ist es aber doch gerade so, dass auch bei nicht 100%iger identität
der gleiche Hashcode ermittelt wird.
"equals()" wird benutzt um zwei Objekte zu vergleichen.
Prüft man darin auf die Identität des Speichers (also wirklich das gleiche Objekt) kann man keine
Liste mehr sinnvoll durchsuchen, weil man für den positiven Vergleich ja das Objekt aus der Liste braucht.
Standardmäßig (also java.lang.Object) wird die Speichergleichheit geprüft.
Also wird für abgeleitete Klassen "equals()" angepasst um auf die Werte innerhalb der Objekte zu reagieren.
Integer:
Code:
public boolean equals(Object obj) {
	if (obj instanceof Integer) {
	    return value == ((Integer)obj).intValue();
	}
(verwendet also nicht "hashcode()")

Hashcodes werden zur Performanceerhöhung eingesetzt. Mit der passenden "equals()" Methode kann man
zwar jetzt prima iterieren und vergleichen, aber der schnellere Zugriff über die Hashcodes geht nicht.
Also wird der Hashcode in Abhängigkeit der enthaltenen Werte gebildet.
Dann kann man wieder den Hashcode zum Listenzugriff verwenden.
Beim Integer ist das ein einfaches "return value". (>> zwei Integer mit gleichem Wert liefern also wieder den gleichen
Hashcode, so wie das von Object verlangt wird)

Also :
equals() positive >> hascode muss übereinstimmen
equals() negative >> hascode darf übereinstimmen, sollte aber besser nicht (performance)
Object -> equals() testet die Identität, hashCode() basiert auf Speicheraddresse.
"Andere" -> equals() teste die Wertegleichheit, hashCode() basiert auf den Werten des Objects

Mehrere "Objects" sollten also nur im Extremfall "zuviel Speicher" (und GC Probleme ?) den gleichen
hashCode haben.
Bei anderen Klassen ist der hashCode bewusst gleich, um Listenfunktinen etc. zu ermöglichen.

Wäre jetzt noch lustig einen Test zu machen, der eine Liste mit echten Objects füllt und zeigt, dass die Gleicheit
nur bei echter Identität erfüllt ist.
Wird aber irgendwie schwer, weil Objects ja nichts anderes haben um sie zu identifizieren, als den hashCode ?


-- -- muckelzwerg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
D Annotationen oder anonyme Funktionen? Allgemeine Java-Themen 0
G Problem mit MVC-Pattern (Controller als anonyme Unterklasse) Allgemeine Java-Themen 2
egrath Anonyme Methode - warum hier kein Compilerfehler Allgemeine Java-Themen 2
sliwalker Threads: Kann man auf anonyme Threads warten? Allgemeine Java-Themen 2
K Objekt an anonyme Klasse übergeben Allgemeine Java-Themen 8
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
N abstracte klassen methoden Allgemeine Java-Themen 32
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
B Problem mit meinen Klassen Allgemeine Java-Themen 6
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
F Code in Klassen bringen Allgemeine Java-Themen 4
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
F Klassen Verwendung abstrakter Klassen Allgemeine Java-Themen 9
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Klassen Abstrakte Klassen Allgemeine Java-Themen 5
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
G Klassen und interne Klassen Allgemeine Java-Themen 1
S Klassen übergeben Allgemeine Java-Themen 13
C Klassen und Konstruktor Allgemeine Java-Themen 2
S Classpath Wie kann ich Java-Library Klassen "verstecken"..? Allgemeine Java-Themen 4
A Java speech - 2 Klassen Allgemeine Java-Themen 1
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
V Klassenname von allen Klassen mit einer bestimmten Eigenschaft bekommen Allgemeine Java-Themen 2
B Classpath Eclipse findet importierte Klassen nicht Allgemeine Java-Themen 1
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
C Arten von Klassen Allgemeine Java-Themen 3
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
S Polymorphie Polymorphismus bei Abstrakten Klassen Allgemeine Java-Themen 2
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
S Kapselung Statische Helper Klassen Allgemeine Java-Themen 5
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
N Java Klassen mit ID Allgemeine Java-Themen 21
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
M OO / Klassen / Projektstruktur Allgemeine Java-Themen 5
O Klassen werden nicht importiert Allgemeine Java-Themen 3
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
A Klassen und JLabel's Allgemeine Java-Themen 12
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D Datentypen Typbestimmung unbekannter Wrapper-Klassen Allgemeine Java-Themen 5
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
N Vergleich eigener Klassen Allgemeine Java-Themen 5
M Klassen Array aus Klassen bestimmter Klassen ? Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben