2010-10-05 3 views
1

Si chaque objet possède une copie différente des variables d'instance, où les méthodes "vivent"?Où les méthodes "vivent"?

À titre d'exemple:

class A { 
    public foo() { 
     System.out.println("foo"); 
    } 
} 

class B extends A { 
    public foo() { 
     System.out.println("foofoo"); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     A a = new B(); 
     a.foo(); // "foofoo" 
    } 
} 

Je sais que "foufou" est imprimé. Ainsi sont les méthodes liées aux objets ou quelque chose?

+0

En raison de la similitude avec une question que j'ai posée dans une langue différente, je vais lier ma question ici. La différence entre flash et java est que flash est un langage basé sur un prototype qui peut avoir une surcharge de méthode lors de l'exécution, c'est pourquoi ma question est différente. http://stackoverflow.com/questions/3783256/as2-are-functions-declared-in-a-class-stored-as-separate-instances-taking-up-mor – M2tM

+0

Depuis le centre-ville économique, une part importante des méthodes a laissé ses tables habituelles pour quelque chose de moins glamour, des vtables virtuels –

Répondre

3

Il s'agit généralement d'un problème de mise en œuvre. Tout ce dont vous avez besoin en tant que programmeur Java est que chaque classe peut avoir des méthodes différentes des autres classes.

En termes de mise en œuvre (si vous êtes intéressé par un comportement sous couverture), la solution la plus simple serait que chaque classe ait un pointeur vers toutes les fonctions pertinentes.

De cette façon, lorsque vous étendez A avec B, une instance de type B va obtenir tous A « pointeurs de méthodes, mais avec le pointage du pointeur de la méthode foo-B » code de.

Une représentation graphique où B étend A, remplaçant tout foo:

class A 
    foo ----------> Afoo code 
    bar ----+-----> Abar code 
class B  | 
    bar ----+ 
    foo ----------> Bfoo code 

instances d'une classe (objets) connaissent leur type afin que vous puissiez facilement obtenir de l'objet b à la classe B. De là, c'est une opération simple pour trouver le bon code à exécuter.

4

Le processus auquel vous faites référence s'appelle dynamique dispatch. La façon dont cela est généralement mis en œuvre est à travers des tables virtuelles (souvent appelés vtables):

http://en.wikipedia.org/wiki/Virtual_table

Un simple résumé de la façon dont VTables travail est que chaque méthode est stockée à une adresse mémoire, et stocke vtable ces adresses . En utilisant votre exemple, A a un vtable avec une entrée qui contient l'adresse mémoire de sa version de foo, tandis que la sous-classe B a son propre vtable avec la même mise en page, mais il détient à la place l'adresse mémoire de son propre foo.

Questions connexes