2009-09-21 3 views
0
interface I 
    { 
     void show(); 
    } 

    class A implements I 
    { 
    void show() 
    { 
     System.out.println("class A"); 
    } 
    public static void main(String s[]) 
    { 
     I i=new A(); 
     i.show(); 
     i.toString(); 
    } 
    } 

Q> En tant qu'interface I ne contient pas la méthode abstraite toString() mais le code suivant est compilé. Comment?méthode de remplacement à l'aide de l'interface

lorsque la variable de super classe est utilisée pour faire référence à une sous-classe obj, alors le compilateur effectue d'abord une recherche sur la méthode similaire dans la super classe si elle n'est pas trouvée, elle donne une erreur. ici L'interface ne contient pas la méthode toString().

ex =>

class A 
{ 
    void show() 
    { 
    System.out.println("show"); 
    } 
} 

class B 
{ 
    void show() 
    { 
    System.out.println("show B"); 
    } 

    void display() 
    { 
    System.out.println("display B"); 
    } 

    public static void main(String s[]) 
    { 
    A a=new B(); 
    a.show();   //will execute 
    a.display();  //give error 
} 

Répondre

7

Toutes les classes héritent de l'objet. L'objet a un toString.

Pour utiliser une interface, elle doit être sauvegardée par une classe réelle. Le compilateur Java sait donc qu'il peut utiliser n'importe quelle méthode définie dans java.lang.Object lorsqu'il s'agit d'une interface.

Pour mettre une manière légèrement différente:

interface I { ... } 

a un « magique »

interface I extends Object { ... } 

Vous pouvez utiliser des méthodes objets lorsque les détails avec I. Cependant, vous ne pouvez pas utiliser toutes les méthodes de la classe concrète qui n'apparaît pas dans l'interface. Donc, pour vous combiner deux exemples:

interface Car { 
    void drive(); 
} 

class Convertible implements Car { 
    void drive() {} 
    void openRoof() {} 

    public static void main() { 
    Car porscheBoxster = new Convertible(); 
    porscheBoxster.drive(); // OK - exists in interface 
    porscheBoxster.toString(); // OK - exists in java.lang.Object. 
    porscheBoxster.openRoof(); // Error. All we know is the porscheBoxster is of type Car. 
     // We don't know if it is a Convertible or not. 
    } 
} 
+0

lorsque la variable de super classe est utilisée pour faire référence à une sous-classe obj, alors le compilateur recherche d'abord la méthode similaire dans la super classe si elle n'est pas trouvée donne une erreur. ici L'interface ne contient pas la méthode toString(). ex => classe A { void show() { System.out.println ("montrer A"); }} classe B { show void() { System.out.println ("show B"); } affichage vide() { System.out.println ("affichage B"); } public void principal (Chaîne s []) { A a = new B(); a.show(); // exécutera a.display(); // donne une erreur } – yash

+0

Toutes les classes héritent de Object en Java. Donc Java sait quand il rencontre une interface, il sera soutenu par une classe concrète et aura donc les méthodes définies dans java.lang.Object –

2

Parce que « toString() » est dans l'objet de classe qui toutes les données non-primitive est dérivé. Donc, chaque objet a cette méthode.

3

Chaque classe en Java est un Object, donc, ils sont toujours en mesure d'exécuter les méthodes suivantes:

  • clone()
  • equals (Object)
  • Finaliser()
  • getClass()
  • hashCode()
  • notify()
  • notifyAll()
  • toString()
  • wait()
  • attente (longue)
  • attente (longue, int)
1

En Java, toutes les classes que vous construisez, hérite de la classe de base Object . Cela signifie que votre classe par défaut aura beaucoup de méthodes utiles, entre autres toString().

Questions connexes