Statičko i dinamičko povezivanje u Javi

1. Uvod

Polimorfizam omogućuje objektu da poprimi više oblika - kada metoda pokazuje polimorfizam, kompajler mora mapirati ime metode u konačnu implementaciju.

Ako je mapirano u vrijeme sastavljanja, to je statično ili rano povezivanje.

Ako se riješi tijekom izvođenja, poznato je kao dinamičko ili kasno vezanje.

2. Razumijevanje kroz kodeks

Kada podrazred proširuje superrazred, može ponovno implementirati metode definirane njime. To se naziva nadjačavanjem metode.

Na primjer, stvorimo superrazred Životinja:

javna klasa Animal {static Logger logger = LoggerFactory.getLogger (Animal.class); javna praznina makeNoise () {logger.info ("generička buka životinja"); } javna void makeNoise (ponavljanja cijelih brojeva) {while (ponavljanja! = 0) {logger.info ("odbrojavanje generičke životinjske buke" + ponavljanja); ponavljanja - = 1; }}}

I podrazred Pas:

pas javne klase proširuje Animal {static Logger logger = LoggerFactory.getLogger (Dog.class); @Preuzmi javnu prazninu makeNoise () {logger.info ("woof woof!"); }}

Pri preopterećenju metode, poput praviti buku() od Životinja klase, prevodilac će razriješiti metodu i njezin kôd u vrijeme sastavljanja. Ovo je primjer statičkog vezanja.

Međutim, ako dodijelimo objekt tipa Pas na referencu tipa Životinja, prevodilac će riješiti mapiranje funkcijskog koda za vrijeme izvođenja. Ovo je dinamičko povezivanje.

Da bismo razumjeli kako ovo funkcionira, napišite mali isječak koda za pozivanje klasa i njegovih metoda:

Životinjska životinja = nova životinja (); // pozivanje metoda životinjskog objekta animal.makeNoise (); animal.makeNoise (3); // dodjeljivanje psećeg objekta referenci tipa Animal Animal dogAnimal = new Dog (); dogAnimal.makeNoise (); Rezultat gornjeg koda bit će:
com.baeldung.binding.Animal - generička buka životinja com.baeldung.binding.Animal - generičko odbrojavanje buke životinja 3 com.baeldung.binding.Ainding - generičko odbrojavanje buke životinja 2 com.baeldung.binding.Animal - generičko odbrojavanje buke životinja 1 com.baeldung.binding.Dog - woof woof!

Sada, izradimo klasu:

klasa AnimalActivity {javna statična praznina jesti (Životinjska životinja) {System.out.println ("Životinja jede"); } javna statička praznina jesti (pas pas) {System.out.println ("pas jede"); }}

Dodajmo ovu liniju glavnoj klasi:

AnimalActivity.eat (dogAnimal);

Izlaz bi bio:

com.baeldung.binding.AmailActivity - Životinja jede

Ovaj primjer pokazuje da statička funkcija prolazi statičko vezanje.

Razlog je taj što podrazredi ne mogu nadjačati statičke metode. Ako bi podrazred implementirao istu metodu, sakrio bi metodu superrazreda. Slično tome, ako je metoda konačna ili privatna, JVM će napraviti statičko vezanje.

Statička vezana metoda nije povezana s određenim objektom, već je pozvana Tip (tečaj na Javi). Izvršenje takve metode je neznatno brže.

Bilo koja druga metoda prema zadanim je postavkama automatski virtualna metoda u Javi. JVM rješava takve metode tijekom izvođenja i to je dinamičko vezanje.

Točna implementacija ovisi o JVM-u, ali trebao bi pristup sličan C ++-u, gdje JVM traži virtualnu tablicu kako bi odlučio o kojem će se objektu metoda pozivati.

3. Zaključak

Vezanje je sastavni dio jezika koji provodi polimorfizam, važno je razumjeti implikacije statičkog i dinamičkog vezanja kako bismo bili sigurni da se naše aplikacije ponašaju onako kako mi želimo.

S tim razumijevanjem, međutim, možemo učinkovito koristiti nasljeđivanje klase, kao i preopterećenje metode.

Kao i uvijek, kôd je dostupan na GitHub-u.