116 votes

Liaison statique vs dynamique en Java

Je suis actuellement en train de faire un devoir pour l'un de mes cours, et dedans, je dois donner des exemples, en utilisant la syntaxe Java, de liaison statique et de liaison dynamique.

Je comprends le concept de base, selon lequel la liaison statique se produit au moment de la compilation et la liaison dynamique se produit à l'exécution, mais je n'arrive pas vraiment à comprendre comment elles fonctionnent spécifiquement.

J'ai trouvé un exemple de liaison statique en ligne qui donne cet exemple :

public static void callEat(Animal animal) {
    System.out.println("L'animal mange");
}

public static void callEat(Dog dog) {
    System.out.println("Le chien mange");
}

public static void main(String args[])
{
    Animal a = new Dog();
    callEat(a);
}

Et que cela afficherait "l'animal mange" parce que l'appel à callEat utilise une liaison statique, mais je suis incertain quant à pourquoi cela est considéré comme une liaison statique.

Jusqu'à présent, aucun des sources que j'ai consultées n'a réussi à m'expliquer de manière claire.

1voto

Soudipta Dutta Points 109

Avec la méthode statique dans la classe parent et enfant: Liaison statique

public class test1 {   
    public static void main(String args[]) {
        parent pc = new child(); 
        pc.start(); 
    }
}

class parent {
    static public void start() {
        System.out.println("À l'intérieur de la méthode start de parent");
    }
}

class child extends parent {

    static public void start() {
        System.out.println("À l'intérieur de la méthode start de child");
    }
}

// Sortie => À l'intérieur de la méthode start de parent

Liaison Dynamique :

public class test1 {   
    public static void main(String args[]) {
        parent pc = new child();
        pc.start(); 
    }
}

class parent {
   public void start() {
        System.out.println("À l'intérieur de la méthode start de parent");
    }
}

class child extends parent {

   public void start() {
        System.out.println("À l'intérieur de la méthode start de child");
    }
}

// Sortie => À l'intérieur de la méthode start de child

0voto

Namrata M Points 1

Toutes les réponses ici sont correctes mais je veux ajouter quelque chose qui manque. lorsque vous annulez une méthode statique, on dirait que nous l'annulons mais en réalité ce n'est pas une annulation de méthode. Au lieu de cela, on l'appelle une méthode de masquage. Les méthodes statiques ne peuvent pas être annulées en Java.

Regardez l'exemple ci-dessous:

class Animal {
    static void eat() {
        System.out.println("l'animal mange...");
    }
}

class Dog extends Animal {

    public static void main(String args[]) {

        Animal a = new Dog();
        a.eat(); // imprime >> animal is eating...

    }

    static void eat() {
        System.out.println("le chien mange...");
    }
}

Dans la liaison dynamique, la méthode est appelée en fonction du type de référence et non du type d'objet que la variable de référence contient Ici, la liaison statique se produit parce que le masquage de méthode n'est pas un polymorphisme dynamique. Si vous supprimez le mot-clé statique devant eat() et en faites une méthode non statique, alors cela vous montrera un polymorphisme dynamique et non un masquage de méthode.

j'ai trouvé le lien ci-dessous pour soutenir ma réponse: https://youtu.be/tNgZpn7AeP0

0voto

dalusC Points 23

Dans le cas de la liaison statique, le type d'objet est déterminé au moment de la compilation, alors que dans la liaison dynamique, le type d'objet est déterminé à l'exécution.

class Dynamique{

    void run2(){
        System.out.println("liaison_dynamique");
    }

}

public class LiaisonStatiqueDynamique extends Dynamique {

    void run(){
        System.out.println("liaison_statique");
    }

    @Override
    void run2() {
        super.run2();
    }

    public static void main(String[] args) {
        LiaisonStatiqueDynamique stat_vs_dyna = new LiaisonStatiqueDynamique();
        stat_vs_dyna.run();
        stat_vs_dyna.run2();
    }

}

-3voto

Aaron Points 652

Parce que le compilateur connaît la liaison au moment de la compilation. Si vous invoquez une méthode sur une interface, par exemple, le compilateur ne peut pas savoir et la liaison est résolue au moment de l'exécution car l'objet réel sur lequel une méthode est invoquée pourrait être l'un de plusieurs. C'est donc une liaison dynamique ou dynamique.

Votre invocation est liée à la classe Animal au moment de la compilation car vous avez spécifié le type. Si vous passez cette variable à une autre méthode ailleurs, personne ne saurait (à part vous car vous l'avez écrit) quelle classe réelle elle serait. Le seul indice est le type déclaré d'Animal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X