Liaison statique Java et liaison dynamique
Récemment, j'ai appris la connaissance de Java et appris la liaison statique et dynamique de Java. Ensuite, j'ai résumé et trié les connaissances correspondantes sur Baidu pour aider à maîtriser cette partie des connaissances.
Le concept de liaison du programme:
La liaison se réfère à l'association d'un appel de méthode avec la classe (le corps de la méthode) où se trouve la méthode. Pour Java, la liaison est divisée en liaison statique et liaison dynamique; ou il est appelé la liaison précoce et la liaison tardive.
Reliure statique:
La méthode est liée avant l'exécution du programme (c'est-à-dire que vous savez déjà quelle classe la méthode se trouve dans le processus de compilation), et elle est implémentée par le compilateur ou d'autres programmes de connexion. Par exemple: C.
Il peut être compris simplement comme contraignant pendant la période de compilation du programme pour Java; Ici, il est particulièrement clair que les seules méthodes de Java sont finales, statiques, privées et constructeurs qui préfèrent
Liaison dynamique:
Liaison ultérieure: se lie au type de l'objet spécifique à l'exécution.
Si un langage met en œuvre la liaison tardive, il doit également fournir des mécanismes pour déterminer séparément le type de l'objet pendant le fonctionnement et appeler les méthodes appropriées. En d'autres termes, le compilateur ne connaît toujours pas le type d'objet pour le moment, mais le mécanisme d'appel de méthode peut l'étudier seul et trouver le bon corps de méthode. Différentes langues ont différentes façons d'implémenter la liaison tardive. Mais nous pouvons au moins penser de cette façon: ils doivent tous installer certains types d'informations spéciaux dans l'objet.
Processus de liaison dynamique:
Final, statique, privé et constructeurs sont la compréhension de la liaison précoce
Pour la méthode privée, tout d'abord, il ne peut pas être hérité. Puisqu'il ne peut pas être hérité, il n'y a aucun moyen de l'appeler via l'objet de sa sous-classe, mais ne peut être appelé que par l'objet de cette classe elle-même. Par conséquent, on peut dire que la méthode privée est liée à la classe qui définit cette méthode.
Bien que la méthode finale puisse être héritée, elle ne peut pas être écrasée (remplacée). Bien que l'objet de classe enfant puisse être appelé, la méthode finale définie dans la classe parent est appelée (à partir de cela, nous pouvons savoir que la méthode est déclarée comme type final, l'une consiste à empêcher la méthode d'être écrasée et que l'autre est de fermer efficacement la liaison dynamique en Java).
Les constructeurs ne peuvent pas être hérités (il est également dit que les sous-classes héritent inconditionnellement du constructeur sans paramètres de la classe parent comme constructeur, mais je pense personnellement que cette déclaration est inappropriée, car nous savons que les sous-classes appellent le constructeur sans paramètres de la classe parent par le biais de Super () pour terminer l'initialisation de la classe parent Constructeur de la classe). Par conséquent, vous pouvez également savoir à quelle classe appartient à ce constructeur lors de la compilation.
Je ne peux pas bien expliquer les principes spécifiques de la méthode statique. Cependant, sur la base des informations en ligne et de ma propre expérience, nous pouvons conclure que la méthode statique peut être héritée par les sous-classes, mais ne peut pas être réécrite (remplacée) par les sous-classes, mais peut être cachée par les sous-classes. (Cela signifie que s'il existe une méthode statique dans la classe parent et s'il n'y a pas de méthode correspondante dans sa sous-classe, alors la méthode de la classe parent sera utilisée lorsque l'objet de classe enfant appelle cette méthode. Et si la même méthode est définie dans la classe infantile, la méthode définie dans la classe enfant sera appelée si la méthode statique est définie dans la CLASSE CASS La classe parentale, si la classe d'enfants a cette méthode statique.
À partir de ce qui précède, nous pouvons conclure que si une méthode ne peut pas être héritée ou ne peut pas être écrasée après l'héritage, cette méthode adopte la liaison statique.
Compilation et fonctionnement de Java
Le processus de compilation Java est le processus de compilation du fichier source Java en bytecode (code exécutable JVM, c'est-à-dire le fichier .class). Dans ce processus, Java ne traite pas de la mémoire. Dans ce processus, le compilateur effectuera une analyse de syntaxe. Si la syntaxe est incorrecte, une erreur sera signalée.
Le processus d'exécution de Java fait référence à JVM (Java Virtual Machine) Chargement des fichiers ByteCode et interprétation de l'exécution. Dans ce processus, il s'agit de la véritable création de la disposition de la mémoire et de l'exécution des programmes Java.
Il existe deux façons d'exécuter Java Bytecode: (1) Méthode de compilation instantanée: l'interprète compile d'abord les octets en code machine, puis exécute le code machine; (2) Méthode d'exécution de l'explication: L'interprète complète toutes les opérations du programme Java Bytecode en interprétant et en exécutant un petit code à chaque fois. (Ici, nous pouvons voir que le programme Java subit réellement deux conversions pendant le processus d'exécution, d'abord converti en bytecode puis converti en code machine. C'est aussi la raison pour laquelle Java peut être compilé et exécuté partout en un seul GO. Installation de la machine virtuelle Java correspondante sur différentes plates-formes)
Comme mentionné précédemment, pour les méthodes de Java, à l'exception des liaisons finales, statiques, privées et privées qui sont des liaisons précoces, toutes les autres méthodes sont des liaisons dynamiques.
La liaison dynamique typique se produit sous la déclaration de conversion de la classe parent et de la classe enfant:
Par exemple: parent p = new enfants ();
Les détails du processus spécifiques sont les suivants:
1: Le compilateur vérifie le type de déclaration et le nom de la méthode de l'objet.
Supposons que nous appelions la méthode XF (Args) et X a été déclaré comme un objet de classe C, puis le compilateur répertorie toutes les méthodes nommées F dans les méthodes de classe C et F héritées de la superclasse de la classe C.
2: Ensuite, le compilateur vérifie le type de paramètre fourni dans l'appel de la méthode.
Si un type de paramètre parmi toutes les méthodes avec le nom F correspond le plus au type de paramètre fourni par l'appel le plus, cette méthode est appelée. Ce processus est appelé "résolution de surcharge".
3: Lorsque le programme s'exécute et utilise la liaison dynamique pour appeler les méthodes, la machine virtuelle doit appeler une version de méthode qui correspond au type réel de l'objet pointé par x.
Supposons que le type réel est D (une sous-classe de C), si la classe D définit F (String), alors la méthode est appelée, sinon la méthode F (String) sera recherchée dans la superclasse de D, etc.
Lorsqu'une machine virtuelle Java appelle une méthode de classe (méthode statique), il sélectionne la méthode appelée en fonction du type de référence d'objet (généralement connu au moment de la compilation). Au contraire, lorsqu'une machine virtuelle appelle une méthode d'instance, il sélectionnera la méthode appelée basée sur le type réel de l'objet (uniquement connu au moment de l'exécution). Il s'agit d'une liaison dynamique, qui est un type de polymorphisme. La liaison dynamique offre une grande flexibilité pour résoudre les problèmes commerciaux réels et est un très beau mécanisme.
Contrairement aux méthodes, lorsqu'ils traitent des variables membre (variables d'instance et variables de classe) dans les classes Java, ce n'est pas une liaison d'exécution, mais une liaison statique au sens général. Ainsi, dans le cas de la transformation ascendante, la méthode de l'objet peut trouver la sous-classe, tandis que l'attribut de l'objet (variable membre) est toujours l'attribut de la classe parent (la sous-classe se cache de la variable membre de la classe parent).
classe publique Père {String Protected Name = "Père Attribut"; } classe publique Son étend le père {String Protected Name = "Son attribut"; public static void main (String [] args) {père échantillon = new Son (); System.out.println ("appelé Property:" + Sample.name); }} Conclusion: L'appelant est l'attribut du père.
Ce résultat montre que l'objet de la classe enfant (la poignée de référence de la classe parent) est appelé à la variable membre de la classe parent. Par conséquent, il doit être clair que la catégorie ciblée par la liaison (dynamique) (dynamique) n'est que la méthode d'un objet.
Vous essayez maintenant d'appeler le nom de la variable du membre de la sous-classe, comment le faire? Le moyen le plus simple consiste à encapsuler la variable membre dans un formulaire de Getter de méthode.
Le code est le suivant:
classe publique Père {String Protected Name = "Père Attribut"; public String getName () {Nom de retour; }} classe publique Son étend le père {String Protected name = "Son attribut"; public String getName () {Nom de retour; } public static void main (String [] args) {père échantillon = new fils (); System.out.println ("appelé Property:" + sampe.getName ()); }} Résultat: l'attribut du fils est appelé
Pourquoi Java adopte-t-il des méthodes de liaison statiques pour les attributs? En effet, la liaison statique présente de nombreux avantages, ce qui nous permet de découvrir des erreurs dans le programme pendant la période de compilation, plutôt que pendant la période d'exécution. Cela améliorera l'efficacité de l'opération du programme! La liaison dynamique des méthodes consiste à implémenter le polymorphisme, qui est une caractéristique majeure de Java. Le polymorphisme est également l'une des technologies orientées objets clés, il vaut donc la peine pour Java de mettre en œuvre le polymorphisme au prix de l'efficacité.
Remarque: La plupart du contenu ci-dessus provient d'Internet, et une petite partie est une opinion personnelle et en aucun cas des remarques faisant autorité. S'il y a un langage inapproprié ou une expression incorrecte, j'espère vous donner des conseils.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!