Maison Java javaDidacticiel Comprendre la liaison statique et la liaison dynamique en Java

Comprendre la liaison statique et la liaison dynamique en Java

Dec 26, 2016 pm 04:07 PM

L'exécution d'un programme Java nécessite deux étapes : la compilation et l'exécution (interprétation). En même temps, Java est un langage de programmation orienté objet. Lorsque la sous-classe et la classe parent ont la même méthode et que la sous-classe remplace la méthode de la classe parent, lorsque le programme appelle la méthode au moment de l'exécution, doit-il appeler la méthode de la classe parent ou la méthode substituée de la sous-classe ? devrait être la question lorsque nous apprenons pour la première fois les problèmes rencontrés en Java. Ici, nous allons d’abord déterminer quelle méthode appeler ou quelle opération de variables est appelée liaison.

Il existe deux méthodes de liaison en Java, l'une est la liaison statique, également appelée liaison anticipée. L’autre est la liaison dynamique, également appelée liaison tardive.

Le concept de liaison de programme :

La liaison fait référence à l'association d'un appel de méthode avec la classe (corps de la méthode) dans laquelle se trouve la méthode. Pour Java, la liaison est divisée en liaison statique et liaison dynamique ; ou liaison anticipée et liaison tardive

Liaison statique (liaison anticipée du compilateur) :

La méthode a été liée avant l'exécution du programme. , qui est implémenté par le compilateur ou un autre éditeur de liens. Par exemple : C. Pour Java, cela peut être compris comme une liaison lors de la compilation du programme ; en particulier, les seules méthodes en Java sont les méthodes finales, statiques, privées et constructeur, qui sont des liaisons précoces

liaison dynamique (liaison d'exécution de liaison tardive) ) :

Liaison tardive : liaison basée sur le type d'objet spécifique au moment de l'exécution.

Si un langage implémente une liaison tardive, il doit également fournir un mécanisme pour déterminer le type de l'objet pendant l'exécution et appeler respectivement les méthodes appropriées. En d'autres termes, le compilateur ne connaît toujours pas le type de l'objet pour le moment, mais le mécanisme d'appel de méthode peut enquêter par lui-même et trouver le corps de méthode correct. Différentes langues implémentent la liaison tardive différemment. Pensez-y de cette façon : ils doivent tous insérer un type spécial d’informations dans l’objet.

Processus de liaison dynamique :

La machine virtuelle extrait la table de méthodes du type réel de l'objet

La machine virtuelle recherche la signature de la méthode

Appelle la méthode

Résumé de la liaison :

Après avoir compris les concepts des trois, nous avons découvert que Java appartient à la liaison tardive. En Java, presque toutes les méthodes sont liées tardivement. Les méthodes liées dynamiquement appartiennent à des sous-classes ou à des classes de base au moment de l'exécution. Mais il y en a aussi des 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. Un point particulier à noter est que les méthodes et les variables membres déclarées en privé ne peuvent pas être héritées par les sous-classes. Toutes les méthodes privées sont implicitement désignées comme finales (de là, nous savons : déclarer les méthodes comme type final consiste à empêcher la méthode d'être écrasée. , la seconde est de désactiver efficacement la liaison dynamique en Java). La liaison tardive en Java est implémentée par la JVM. Nous n'avons pas besoin de la déclarer explicitement, mais c'est différent en C. Une certaine méthode doit être explicitement déclarée pour avoir une liaison tardive. La conversion ascendante ou le polymorphisme en Java est réalisé à l'aide de la liaison dynamique, donc comprendre la liaison dynamique signifie également la conversion ascendante et le polymorphisme.

Pour les méthodes en Java, à l'exception des méthodes finales, statiques, privées et constructeur qui sont pré-liées, toutes les autres méthodes sont liées dynamiquement. La liaison dynamique se produit généralement sous la déclaration de conversion de la classe parent et de la sous-classe :

Par exemple : Parent p = new Children();

Le processus spécifique est le suivant :

1. Le compilateur vérifie le type déclaré et le nom de méthode de l'objet. Supposons que nous appelions la méthode x.f(args) et que x ait été déclaré comme objet de classe C, alors le compilateur énumérera toutes les méthodes nommées f dans la classe C et les méthodes f héritées de la super classe de classe C

2. Ensuite, le compilateur vérifie les types de paramètres fournis dans l'appel de méthode. Si parmi toutes les méthodes nommées f, il existe un type de paramètre qui correspond le mieux au type de paramètre fourni par l'appel, alors cette méthode est appelée "résolution de surcharge"

Lorsque le programme est en cours d'exécution. et utilise dynamique Lorsqu'une liaison appelle une méthode, la machine virtuelle doit appeler une version de la méthode qui correspond au type réel de l'objet pointé par x. Supposons que le type réel soit D (une sous-classe de C). Si la classe D définit f(String), alors cette méthode est appelée, sinon la méthode f(String) est recherchée dans la superclasse de D, et ainsi de suite. 🎜>

Réflexion sur un problème :

Comment fournir aux utilisateurs de la méthode une méthode pour accomplir une tâche. Que se passe-t-il si l’utilisateur a des exigences particulières et peut-il personnaliser sa propre méthode ?

Connaissances impliquées :

Classes enfants et parents, interfaces, transformation ascendante, liaison dynamique

Code spécifique :

package com.chengxuyuanzhilu;
 
public interface MyInterfaces {
  void doting();
}
 
 
 
package com.chengxuyuanzhilu;
 
public class Drink implements MyInterfaces {
 
  @Override
  public void doting() {
    System.out.println("我在喝水");
  }
 
}
 
 
 
package com.chengxuyuanzhilu;
 
public class Eat implements MyInterfaces {
 
  @Override
  public void doting() {
    System.out.println("我在吃东西");
  }
 
}
 
 
 
package com.chengxuyuanzhilu;
 
public class Run implements MyInterfaces {
 
  @Override
  public void doting() {
    System.out.println("我在奔跑");
  }
 
}
 
 
 
package com.chengxuyuanzhilu;
 
public class TestDynamicBind {
  public static void main(String[] args) {
    MyInterfaces my = null;
    my = new Eat();
    bind(my);
     
    my = new Drink();
    bind(my);
     
    my = new Run();
    bind(my);
         
  }
   
  static void bind(MyInterfaces my){
    my.doting();
  }
}
Copier après la connexion
Ce qui précède est l'intégralité Contenu de l'article, j'espère qu'il sera utile à l'étude de chacun.

Pour plus d'articles sur la compréhension de la liaison statique et de la liaison dynamique en Java, veuillez faire attention au site Web PHP chinois !

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Mar 17, 2025 pm 05:35 PM

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Mar 17, 2025 pm 05:44 PM

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Mar 17, 2025 pm 05:43 PM

L'article discute de l'utilisation de JPA pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux. Il couvre la configuration, la cartographie des entités et les meilleures pratiques pour optimiser les performances tout en mettant en évidence les pièges potentiels. [159 caractères]

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Mar 17, 2025 pm 05:46 PM

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.

Mar 17, 2025 pm 05:45 PM

L'article discute de la création et de l'utilisation de bibliothèques Java personnalisées (fichiers JAR) avec un versioning approprié et une gestion des dépendances, à l'aide d'outils comme Maven et Gradle.

See all articles