Java >> Java tutorial >  >> Tag >> static

Statisk og dynamisk binding i Java

1. Introduktion

Polymorfi tillader et objekt at antage flere former – når en metode udviser polymorfi, skal compileren kortlægge navnet på metoden til den endelige implementering.

Hvis det er kortlagt på kompileringstidspunktet, er det en statisk eller tidlig binding.

Hvis det løses under kørsel, er det kendt som dynamisk eller sen binding.

2. Forståelse gennem en kode

Når en underklasse udvider en superklasse, kan den genimplementere metoder defineret af den. Dette kaldes en metodetilsidesættelse.

Lad os for eksempel oprette en superklasse Animal:

public class Animal {

    static Logger logger = LoggerFactory.getLogger(Animal.class);

    public void makeNoise() {
        logger.info("generic animal noise");
    }

    public void makeNoise(Integer repetitions) {
        while(repetitions != 0) {
            logger.info("generic animal noise countdown " + repetitions);
            repetitions -= 1;
        }
    }
}

Og en underklasse Hund :

public class Dog extends Animal {

    static Logger logger = LoggerFactory.getLogger(Dog.class);
    
    @Override
    public void makeNoise() {
        logger.info("woof woof!");
    }

}

Ved overbelastning af en metode, såsom makeNoise() af Dyr klasse, vil compileren løse metoden og dens kode på kompileringstidspunktet. Dette er et eksempel på statisk binding.

Men hvis vi tildeler et objekt af typen Hund til en reference af typen Dyr , vil compileren løse funktionskodetilknytningen under kørsel. Dette er dynamisk binding.

For at forstå, hvordan dette fungerer, lad os skrive et lille kodestykke til at kalde klasserne og dets metoder:

Animal animal = new Animal();

// calling methods of animal object
animal.makeNoise();
animal.makeNoise(3);

// assigning a dog object to reference of type Animal
Animal dogAnimal = new Dog();

dogAnimal.makeNoise();

The output of the above code will be:
com.baeldung.binding.Animal - generic animal noise 
com.baeldung.binding.Animal - generic animal noise countdown 3
com.baeldung.binding.Animal - generic animal noise countdown 2
com.baeldung.binding.Animal - generic animal noise countdown 1
com.baeldung.binding.Dog - woof woof!

Lad os nu oprette en klasse:

class AnimalActivity {

    public static void eat(Animal animal) {
        System.out.println("Animal is eating");
    }

    public static void eat(Dog dog) {
        System.out.println("Dog is eating");
    }
}

Lad os tilføje disse linjen til hovedklassen:

AnimalActivity.eat(dogAnimal);

Outputtet ville være:

com.baeldung.binding.AnimalActivity - Animal is eating

Dette eksempel viser, at en statisk funktion undergår statisk binding .

Årsagen er, at underklasser ikke kan tilsidesætte statiske metoder. Hvis underklassen implementerede den samme metode, ville den skjule superklassens metode. På samme måde, hvis en metode er endelig eller privat, vil JVM foretage en statisk binding.

En statisk bundet metode er ikke knyttet til et bestemt objekt, men kaldes snarere på Type (klasse i Java). Udførelse af en sådan metode er marginalt hurtigere.

Enhver anden metode er automatisk en virtuel metode i Java som standard. JVM'en løser sådanne metoder under kørsel, og dette er dynamisk binding.

Den nøjagtige implementering afhænger af JVM'en, men det ville kræve en C++-lignende tilgang, hvor JVM'en slår den virtuelle tabel op for at beslutte, hvilket objekt metoden skal kaldes.

3. Konklusion

Binding er en integreret del af et sprog, der implementerer polymorfi, det er vigtigt at forstå implikationerne af både statisk og dynamisk binding for at være sikker på, at vores applikationer opfører sig, som vi vil have dem til.

Med den forståelse er vi imidlertid i stand til effektivt at bruge klassearv såvel som metodeoverbelastning.

Som altid er koden tilgængelig på GitHub.


Java tag