L'exécution d'un programme Java nécessite deux étapes: la compilation et l'exécution (interprétation), et Java est un langage de programmation orienté objet. Lorsque la sous-classe et la classe parent ont la même méthode, la sous-classe remplace la méthode de la classe parent. Lorsque le programme appelle la méthode lors de l'exécution, que la méthode de la classe parent soit appelée ou que la sous-classe soit remplacée, cela devrait être un problème que nous rencontrons lorsque nous commençons à apprendre Java. Ici, nous déterminons d'abord la méthode à implémenter ou le fonctionnement variable pour déterminer cet appel est appelé liaison.
Il existe deux méthodes de liaison dans Java, l'une est une liaison statique, également connue sous la liaison précoce. Un autre type est la liaison dynamique, également connue sous le nom de liaison tardive.
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.
Liaison statique (liaison du compilateur de liaison précoce):
La méthode a été liée avant l'exécution du programme et est implémentée par le compilateur ou un autre programme de connexion. Par exemple: C. Pour Java, il peut être compris comme contraignant pendant la période de compilation du programme; Plus précisément, les seules méthodes de Java sont finales, statiques, privées et constructeurs qui préfèrent
Liaison dynamique (liaison tardive pendant l'exécution):
Liaison ultérieure: se lie au type de l'objet spécifique à l'exécution.
Si un langage met en œuvre une liaison tardive, il est nécessaire de fournir certains mécanismes pour déterminer séparément le type de l'objet pendant le fonctionnement et d'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. On peut penser qu'ils doivent tous insérer certains types d'informations spéciaux dans l'objet.
Processus de liaison dynamique:
Résumé sur la contrainte:
Après avoir compris le concept des trois, nous avons constaté que Java appartient à la liaison tardive. En Java, presque toutes les méthodes sont des méthodes de liaison tardive et les méthodes de liaison dynamiquement sont des sous-classes ou des classes de base au moment de l'exécution. Mais il existe également des fonctionnalités spéciales. Étant donné que les méthodes statiques et les méthodes finales ne peuvent pas être héritées, leurs valeurs peuvent être déterminées au moment de la compilation. Ils appartiennent à la liaison précoce. Pour être particulièrement noté, les méthodes et les variables des membres déclarées par privé ne peuvent pas être héritées par les sous-classes, et toutes les méthodes privées sont implicitement spécifiées comme finales (à partir de cela, nous savons que la méthode déclarée comme type final est d'empêcher que la méthode soit écrasée et de fermer efficacement la liaison dynamique en Java). Le post-liaison dans Java est mis en œuvre par le JVM. Nous n'avons pas besoin de le déclarer explicitement, mais C ++ est différent. Nous devons déclarer explicitement qu'une méthode a après la liaison. La transformation vers le haut ou le polymorphisme dans Java est obtenue grâce à une liaison dynamique, donc la compréhension de la liaison dynamique signifie une transformation vers le haut et le polymorphisme.
Pour les méthodes en Java, à l'exception de la liaison précoce finale, statique, privée et privée, toutes les autres méthodes sont une liaison dynamique. 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 ();
Le processus spécifique est le suivant:
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 la classe C et les méthodes héritées de la superclasse de la classe C.
2. Ensuite, le compilateur vérifie les types de paramètres fournis 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é "analyse 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. En supposant 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.
Réflexions de question:
Comment fournir à un utilisateur de la méthode avec une méthode pour effectuer une tâche. Si l'utilisateur a des exigences particulières, il ou elle doit personnaliser sa propre méthode?
Connaissances impliquées:
Classe de parent enfants, interface, transformation ascendante, liaison dynamique
Code spécifique:
package com.chengxUyuanzHiLU; interface publique myInterfaces {void Doting ();} package com.chengxUyuanzHiLU; public class Drink implémente myInterfaces {@Override public void Doting () {System.out.println ("Je boit de l'eau"); }} package com.chengxuyuanzhilu; public class Eat implémente myInterfaces {@Override public void Doting () {System.out.println ("je mange"); }} package com.chengxUyuanzHiLU; public class run implémente myInterfaces {@Override public void steting () {System.out.println ("je running"); }} package com.chengxUyuanzHiLU; public class testDamicBind {public static void main (String [] args) {myInterfaces my = null; mon = new Eat (); lier (mon); My = new Drink (); lier (mon); mon = new run (); lier (mon); } static void bind (myInterfaces my) {my.doting (); }}Ce qui précède concerne cet article, j'espère qu'il sera utile à l'apprentissage de tout le monde.