2010-06-05 22 views
6

Quelqu'un peut-il expliquer le fonctionnement du code suivant ...?Quelqu'un peut-il expliquer le fonctionnement du code suivant ...?

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";}}); 
    } 
} 

sortie est ...

myInterfacetoString 
[email protected] 

Toutes les réponses en disant que MyInterface dans l'instruction println() est classe anonyme. Mais comme je l'ai déjà déclaré en tant qu'interface, pourquoi me permet-il de créer une classe anonyme de même nom ....?

à nouveau ... si ceux-ci sont des classes anonymes alors la classe principale devrait me permettre de donner un nom à ces classes..But anonymes si essayer de faire so..I'm obtenir erreur de compilation

+0

Est-ce un devoir ou une curiosité? C'est considéré comme une bonne forme d'étiqueter les questions de devoirs en tant que tels. – ojrac

+1

Siddhi, bonne question. Cependant, je suggère que vous ne changiez pas la question trop souvent avec un contenu significativement nouveau. Au lieu de cela, vous pouvez soumettre une nouvelle question et y faire référence. – akf

+0

Cela crée une instance d'une classe anonyme implémentant une interface vide. On substitue toString() afin que System.out.println l'utilise automatiquement. L'autre a myFunction, qui n'est pas appelé, donc il utilise Object toString() qui donne un peu d'information incluant l'adresse de l'objet. – mk12

Répondre

14

Lorsque vous imprimez sur un objet, il appellera la méthode toString(). Dans la première instruction, vous créez un nouvel objet et remplacez la méthode appelée toString. Par conséquent, cette méthode toString() est appelée lorsque l'objet est imprimé.

Dans la deuxième instruction, vous créez également un objet mais vous ne surchargez pas la méthode toString() pour utiliser la méthode toString() de la classe Object.

Pour la nouvelle question, ce lien a une bonne explication pour votre compréhension: Anonymous Classes

Voici une copie de l'explication:

new className(optional argument list){classBody} 

Cette expression instancie un nouvel objet à partir d'un sans nom et classe précédemment indéfinie, qui étend automatiquement la classe nommée className, et qui ne peut implémenter explicitement aucune interface. Le corps de la nouvelle classe est donné par classBody.

Le résultat de l'exécution de cette expression est celle d'une nouvelle classe qui étend className est définie, un nouvel objet de la nouvelle classe est instancié, et l'expression est remplacée par une référence au nouvel objet.

new interfaceName(){classBody} 

Cette expression instancie un nouvel objet d'une classe sans nom et précédemment définie, qui automatiquement implémente l'interface nommée interfaceName et automatiquement étend la classe nommée Object. La classe peut implémenter explicitement une, et une seule interface, et ne peut pas étendre une classe autre que l'objet. Encore une fois, le corps de la nouvelle classe est donné par classBody.

Est-ce clair pour vous maintenant?

+0

Ok ... mais cela appelle la méthode toString car myAbstractClass est par défaut extends Object class ... Mais si j'utilise Interface au lieu de abstract class ... ça me donne la même sortie ... pourquoi ça donc ..? – Siddhi

+2

Tous les objets étendent directement ou indirectement, explicitement ou implicitement la classe Object. Si vous utilisez une interface au lieu d'une classe abstraite, vos classes anonymes étendront implicitement Object. – emory

+0

J'ai déjà ajouté une nouvelle explication plus claire de la classe anonyme pour l'interface. Vous devriez également regarder le lien, il est vraiment bon :) – vodkhang

3

Sur la première println() vous remplacez la méthode toString() de la myAbstractClass instance anonyme, donc vous obtenez la chaîne retournée par votre méthode toString() overriden, c'est le comportement par défaut de la fonction println().

Au deuxième println(), vous ne surchargez pas la méthode toString(), donc println() utilise celui par défaut (héritée de Object). Sur une note de côté, essayez de formater votre code correctement, il est beaucoup plus facile à lire et à comprendre.

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

Ok ... mais cela appelle méthode toString comme myAbstractClass est par défaut étend la classe Object ... Mais si j'utilise Interface au lieu de la classe abstraite ... il me donne la même sortie ... pourquoi c'est si ..? – Siddhi

+1

Parce que toute instance d'objet que vous créez, même si elle provient d'une classe implémentant une interface, s'étend à partir de Object. http://java.sun.com/javase/6/docs/api/java/lang/Object.html – Cesar

3

myAbstractClass est une classe minimale. Il hérite de l'objet. La classe principale construit deux classes internes anonymes à partir de myAbstractClass, et imprime leur sortie toString.

  1. La classe interne remplace la méthode toString et vous voyez sa sortie.
  2. La classe interne obtient une méthode ajoutée et vous la définition par défaut toString.
1

Dans les deux scénarios, vous avez imprimé l'objet. Donc, il va appeler toString() méthode de l'objet. Dans le premier scénario, puisque vous avez remplacé la méthode toString(), il imprime myAbstractClass toString. Dans le second scénario, puisqu'il n'a pas été remplacé, il appelle la valeur par défaut toString() implémentée dans la classe Object.

Je pense que vous attendez appel de fonction dans le 2e scénario qui est faux. Vous venez de l'ignorer mais jamais appelé.