2010-06-05 6 views
6

Kann jemand die Funktionsweise des folgenden Codes erklären ...?Kann jemand die Funktionsweise des folgenden Codes erklären ...?

interface myInterface{} 

public class Main { 

    public static void main(String[] args) { 

     System.out.println(new myInterface(){public String toString(){return "myInterfacetoString";}}); 

     System.out.println(new myInterface(){public String myFunction(){return "myInterfacemyFunction";}}); 
    } 
} 

Ausgang ist ...

myInterfacetoString 
[email protected] 

Alle Antworten, die myInterface in println sagen() Aussage ist anonyme Klasse. Aber wie ich es bereits als Schnittstelle erklärte, warum erlaubt es mir, anonyme Klasse mit dem gleichen Namen zu erstellen ....?

wieder ... wenn diese anonyme Klassen sind, dann sollten Klasse Haupt mir erlauben, einen beliebigen Namen zu diesen anonymen classes..But zu geben, wenn versuchen so..I'm immer Kompilierungsfehler

+0

Ist das Hausaufgaben oder Neugier? Es wird als gute Form angesehen, Hausaufgaben als solche zu markieren. – ojrac

+1

Siddhi, große Frage. Ich schlage jedoch vor, dass Sie die Frage nicht zu oft mit wesentlich neuen Inhalten ändern. Stattdessen können Sie eine neue Frage einreichen und diese darin referenzieren. – akf

+0

Dies macht eine Instanz einer anonymen Klasse, die eine leere Schnittstelle implementiert. One überschreibt toString(), so dass System.out.println das automatisch verwendet. Die andere hat myFunction, die nicht aufgerufen wird, also verwendet sie Object toString(), die ein wenig Information einschließlich der Adresse des Objekts gibt. – mk12

Antwort

14

Wenn Sie den Druck tun Aus einem Objekt wird die toString() -Methode aufgerufen. In der ersten Anweisung erstellen Sie ein neues Objekt und überschreiben auch die Methode toString. Daher wird diese toString() -Methode aufgerufen, wenn ein Objekt gedruckt wird.

In der zweiten Anweisung erstellen Sie auch ein Objekt, überschreiben jedoch nicht die Methode toString(), sodass die Methode toString() der Object-Klasse verwendet wird.

Für die neue Frage, hat diese Verbindung eine gute Erklärung für Ihr Verständnis: Anonymous Classes

Hier ist eine Kopie der Erklärung ist:

new className(optional argument list){classBody} 

Dieser Ausdruck ein neues Objekt aus einem ungenannten instanziiert und zuvor undefinierte Klasse, die automatisch erweitert die Klasse namens className, und die kann nicht explizit implementieren keine Schnittstellen. Der Body der neuen Klasse wird durch classBody angegeben.

Das Ergebnis dieser Expression Ausführung ist, dass eine neue Klasse, die classname erstreckt definiert ist, ein neues Objekt der neuen Klasse instanziiert und der Ausdruck durch einen Verweis auf das neue Objekt ersetzt wird.

new interfaceName(){classBody} 

Dieser Ausdruck instanziiert ein neues Objekt von einer unnamed und vorher undefinierte Klasse, die automatisch die Schnittstelle interface genannt implementiert und automatisch erstreckt sich die Klasse mit der Bezeichnung Objekt. Die Klasse kann explizit implementieren, und nur eine Schnittstelle und kann keine andere Klasse als Objekt erweitern. Der Hauptteil der neuen Klasse wird wiederum von classBody angegeben.

Ist es Ihnen jetzt klar?

+0

Okay ... aber das ruft toString-Methode als myAbstractClass ist standardmäßig erweitert Objektklasse ... Aber wenn ich Interface anstelle von abstrakten Klasse verwenden ... es gibt mir die gleiche Ausgabe ... warum es so ..? – Siddhi

+2

Alle Objekte entweder direkt oder indirekt, explizit oder implizit erweitert Objektklasse. Wenn Sie eine Schnittstelle anstelle einer abstrakten Klasse verwenden, erweitern Ihre anonymen Klassen Object implizit. – emory

+0

Ich habe bereits eine neue, klarere Erklärung für die anonyme Klasse für die Schnittstelle hinzugefügt. Sie sollten auch auf den Link schauen, es ist wirklich gut :) – vodkhang

3

Am ersten println() Sie die toString() Methode aus der anonymen myAbstractClass Instanz überschreiben, Sie daher die Zeichenfolge von Ihrer außer Kraft gesetzt toString() Methode zurückgegeben bekommen, das ist das Standardverhalten der println() Funktion.

Am zweiten println(), Sie sind die toString() Methode nicht überschreiben, verwendet so println() den Standard eines (geerbt von Object).

Nebenbei, versuchen Sie, Ihren Code richtig zu formatieren, ist viel einfacher zu lesen und zu verstehen.

abstract class myAbstractClass{} 

public class Main { 
    public static void main(String[] args) { 
     System.out.println(new myAbstractClass(){ 
      public String toString(){ 
       return "myAbstractClass toString"; 
      } 
     }); 

     System.out.println(new myAbstractClass(){ 
      public String myFunction(){ 
       return "myAbstractClass myFunction"; 
      } 
     }); 
    } 
} 
+0

Okay ... aber das ruft toString-Methode als myAbstractClass ist standardmäßig erweitert Objektklasse ... Aber wenn ich Interface statt abstrakte Klasse verwenden ... gibt es mir die gleiche Ausgabe ... warum es so ..? – Siddhi

+1

Da jede Objektinstanz, die Sie erstellen, auch wenn sie aus einer Klasse stammt, die eine Schnittstelle implementiert, von Objekt ausgeht. http://java.sun.com/javase/6/docs/api/java/lang/Object.html – Cesar

3

myAbstractClass ist eine minimale Klasse. Es erbt von Objekt.

Die Klasse main erstellt zwei anonyme innere Klassen von myAbstractClass und gibt ihre toString-Ausgabe aus.

  1. Die innere Klasse überschreibt die toString-Methode und Sie sehen ihre Ausgabe.
  2. Die innere Klasse erhält eine Methode hinzugefügt, und Sie die Standarddefinition toString.
1

In beiden Szenarien haben Sie das Objekt gedruckt. So wird es toString() Methode des Objekts aufrufen. Im ersten Szenario, da Sie die toString() Methode überschrieben haben, so druckt es myAbstractClass toString. Da es im zweiten Szenario nicht überschrieben wurde, ruft es den Standard toString() auf, der in der Klasse Object implementiert ist.

Ich denke, Sie erwarten Funktionsaufruf im 2. Szenario, das falsch ist. Sie haben es gerade außer Kraft gesetzt, aber nie angerufen.

Verwandte Themen