Kurzer Quellcode klein aber oho!

Wang

Bekanntes Mitglied
Hallo,

dieses simple Beispiel aus einem Lehrbuch hat so ziemlich sicher mein Verständnis über Konstruktoren zerstört.
Bisher wurde einem immer gesagt "ref.toString()" wäre die korrekte Form des Aufrufs.
Irgendwie leuchtet es mir jetzt nicht ein wie die Form im Quellcode dennoch dazu führt, dass die Zahl 1 ausgegeben wird?

Thanks.

Gruß
Wang

P.S. Nachdem ich mich inzwischen auch schon einige Zeit lang mit Java beschäftige, ist mir mein Thread wirklich peinlich.


Java:
public class Test11 extends Object
{
   private int var = 1;

   public String toString()
   {
      return Integer.toString (var);
   }
   
   public static void main (String[] args)
   {
      Object ref = new Test11();
      System.out.println (ref);
   }
}
 
???:L
Was hat das jetzt mit dem Konstruktor zu tun. Du überschreibst die toString-Methode und gibst dort "1" zurück.
Code:
System.out.println (ref);
führt dazu dass die toString Methode aufgerufen wird..ganz einfach, den Zusammenhang mit dem Konstruktor(der hier übrigens vom Compiler hinzugefügt wird, in deinem Code gibts keinen!!) verstehe ich nicht, erläutere mal genau wo du Verständnisprobleme hast
 
Code:
System.out.println (ref);
führt dazu dass die toString Methode aufgerufen wird..

Genau das verwirrt mich. Nach dem was bisher vermittelt wurde, hätte ich
Code:
System.out.println (ref.toString());
geschrieben. Irgendwie kann ich nicht nachvollziehen, warum automatisch die toString()-Methode aufgerufen wird.

(Das mit dem Überschreiben von Methoden habe ich soweit verstanden und ist nicht das Problem.)
 
Weil println bzw. print so implementiert ist.
Java:
//PrintStream.class
    public void println(Object x) {
        String s = String.valueOf(x);  <--- s.u.
        synchronized (this) {
            print(s);
            newLine();
        }
    }

//String.class
    public static String valueOf(Object obj) {
	return (obj == null) ? "null" : obj.toString();
    }
 
Bisher wurde einem immer gesagt "ref.toString()" wäre die korrekte Form des Aufrufs

Ich glaube das Mißverständnis ist hier, das die "toString()"-Methode eben nicht immer explizit aufgerufen
werden muss. Sobald man ein Objekt mit println() "ausdruckt" wird automatisch die "toString()"-Methode
aufgerufen. Das geht, da sie eine Methode von "Object" ist und daher von jeder Klasse vererbt wird.
Wird die Method nicht überschrieben, steht dann immer so was wie: "Objektname@3214432".
Das ist die Standardausgabe von "Object"'s "toString".

Edit: Ich sollte lernen schneller zu tippen 😀 Hoffentlich kannste mit meiner Antwort trotzdem was
anfangen.
 
Vielen Dank für die sehr guten Erklärungen. Hab ich wieder was dazugelernt. 😉
 
Zuletzt bearbeitet:
Davon abgesehen...

[Java]public class Test11 extends Object[/Java]

das "extends Object" ist unnötig, da alle Klassen (bzw. Objekte) implizit von der Klasse Object abgeleitet werden.
 

Zurück
Oben