Statikus és dinamikus kötés Java-ban

1. Bemutatkozás

A polimorfizmus lehetővé teszi, hogy az objektum többféle formát öltsön - amikor egy módszer polimorfizmust mutat, a fordítónak a módszer nevét a végső megvalósításhoz kell feltérképeznie.

Ha fordítási időben van feltérképezve, akkor statikus vagy korai kötés.

Ha futás közben megoldódik, akkor dinamikus vagy késői kötésként ismerik.

2. Megértés kódex útján

Amikor egy alosztály kiterjeszti a szuperosztályt, akkor újra megvalósíthatja az általa meghatározott módszereket. Ezt nevezzük felülbíráló módszernek.

Hozzunk létre például egy szuperosztályt Állat:

Animal class Animal {static Logger logger = LoggerFactory.getLogger (Animal.class); public void makeNoise () {logger.info ("általános állatzaj"); } public void makeNoise (Egész ismétlések) {while (ismétlések! = 0) {logger.info ("általános állati zaj visszaszámlálás" + ismétlések); ismétlések - = 1; }}}

És egy alosztály Kutya:

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

A módszer túlterheléséről, például a zajt csinálni() nak,-nek Állat osztályban, a fordító a fordítási időben feloldja a metódust és annak kódját. Ez a statikus kötés példája.

Ha azonban típusú objektumot rendelünk hozzá Kutya típusú hivatkozásra Állat, a fordító futás közben megoldja a függvény-kód leképezést. Ez dinamikus kötés.

Hogy megértsük, hogyan működik ez, írjunk egy kis kódrészletet az osztályok és metódusainak meghívására:

Állati állat = új állat (); // állati objektum hívási módszerei animal.makeNoise (); állat.makeNoise (3); // kutyaobjektum hozzárendelése az Animal Animal típusú hivatkozáshoz dogAnimal = new Dog (); dogAnimal.makeNoise (); A fenti kód kimenete a következő lesz:
com.baeldung.binding.Animal - általános állati zaj com.baeldung.binding.Animal - általános állati zaj visszaszámlálás 3 com.baeldung.binding.Animal - általános állati zaj visszaszámlálás 2 com.baeldung.binding.Animal - általános állati zaj visszaszámlálás 1 com.baeldung.binding.Dog - woo woo!

Most hozzunk létre egy osztályt:

osztály AnimalActivity {public static void eat (állati állat) {System.out.println ("Az állat eszik"); } public static void eat (Kutya kutya) {System.out.println ("A kutya eszik"); }}

Adjuk hozzá ezeket a sort a fő osztályhoz:

AnimalActivity.eat (dogAnimal);

A kimenet a következő lenne:

com.baeldung.binding.AnimalActivity - Az állat eszik

Ez a példa azt mutatja, hogy egy statikus függvény statikus kötésen megy keresztül.

Ennek oka, hogy az alosztályok nem írhatják felül a statikus módszereket. Ha az alosztály ugyanazt a módszert alkalmazza, elrejti a szuperosztály módszerét. Hasonlóképpen, ha egy módszer végleges vagy privát, a JVM statikus kötést hajt végre.

A statikusan kötött módszer nincs társítva egy adott objektumhoz, hanem inkább meghívásra kerül típus (osztály Java nyelven). Egy ilyen módszer végrehajtása kissé gyorsabb.

Bármely más módszer alapértelmezés szerint automatikusan virtuális módszer a Java-ban. A JVM futás közben megoldja ezeket a módszereket, és ez dinamikus kötés.

A pontos megvalósítás a JVM-től függ, de C ++ -hoz hasonló megközelítésre lenne szükség, ahol a JVM megkeresi a virtuális táblázatot annak eldöntésére, hogy melyik objektumot hívják meg a módszernek.

3. Következtetés

A kötés a polimorfizmust megvalósító nyelv szerves része. Fontos megérteni mind a statikus, mind a dinamikus kötés következményeit, hogy megbizonyosodhassunk arról, hogy alkalmazásaink úgy viselkednek, ahogy szeretnénk.

Ezzel a megértéssel azonban képesek vagyunk hatékonyan használni az osztályöröklést, valamint a módszer túlterhelését.

Mint mindig, a kód elérhető a GitHubon.