Statisk og dynamisk binding i Java

1. Introduktion

Polymorfisme tillader et objekt at tage flere former - når en metode udviser polymorfisme, 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 ved 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, der er defineret i den. Dette kaldes en metode, der tilsidesætter.

Lad os for eksempel oprette en superklasse Dyr:

offentlig klasse Animal {static Logger logger = LoggerFactory.getLogger (Animal.class); offentlig ugyldighed makeNoise () {logger.info ("generisk dyrestøj"); } public void makeNoise (Integer repetitions) {while (repetitions! = 0) {logger.info ("generisk nedtælling af dyrestøj" + gentagelser); gentagelser - = 1; }}}

Og en underklasse Hund:

offentlig klasse Hund udvider Animal {static Logger logger = LoggerFactory.getLogger (Dog.class); @ Overstyr offentlig tomrum makeNoise () {logger.info ("woof woof!"); }}

Ved overbelastning af en metode, som f.eks lav larm() 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, løser compileren kortlægningen af ​​funktionskoden ved kørsel. Dette er dynamisk binding.

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

Dyredyr = nyt dyr (); // kaldemetoder til animalsk objekt animal.makeNoise (); animal.makeNoise (3); // tildele et hundeobjekt til reference af typen Animal Animal dogAnimal = new Dog (); dogAnimal.makeNoise (); Output af ovenstående kode vil være:
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:

klasse AnimalActivity {public static void eat (Animal animal) {System.out.println ("Animal is eating"); } offentlig statisk ugyldighed spiser (Hund hund) {System.out.println ("Hund spiser"); }}

Lad os tilføje disse linjen til hovedklassen:

AnimalActivity.eat (dogAnimal);

Outputtet ville være:

com.baeldung.binding.AnimalActivity - Dyr spiser

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

Årsagen er, at underklasser ikke kan tilsidesætte statiske metoder. Hvis underklassen implementerede den samme metode, ville den skjule superklassens metode. Tilsvarende, hvis en metode er endelig eller privat, vil JVM gøre en statisk binding.

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

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

Den nøjagtige implementering afhænger af JVM, men det tager en C ++ - lignende tilgang, hvor JVM ser op på den virtuelle tabel for at beslutte, hvilket objekt metoden skal kaldes.

3. Konklusion

Binding er en integreret del af et sprog, der implementerer polymorfisme, det er vigtigt at forstå konsekvenserne 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 dog i stand til effektivt at bruge klassearv såvel som metodeoverbelastning.

Som altid er koden tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found