CodeGym /Java blog /Véletlen /10 dolog, amit tudnod kell a Java statikus módosítójáról
John Squirrels
Szint
San Francisco

10 dolog, amit tudnod kell a Java statikus módosítójáról

Megjelent a csoportban
A Java-ban a statikus módosító azt jelenti, hogy valami közvetlenül kapcsolódik egy osztályhoz: ha egy mező statikus, akkor az osztályhoz tartozik; ha egy metódus statikus, akkor az osztályhoz tartozik. Ennek eredményeként az osztály nevét használhatja statikus metódusok meghívására vagy statikus mezőre való hivatkozásra. Például, ha a countmező statikus az osztályban Counter, az azt jelenti, hogy a következő kifejezéssel hivatkozhat a változóra: Counter.count. 10 dolog, amit tudnod kell a Java statikus módosítójáról - 1Természetesen figyelembe kell venni a hozzáférés módosítókat. Például privatea mezők csak azon az osztályon belül érhetők el, amelyben deklarálva vannak. A protectedmezők a csomagon belüli összes osztály számára, valamint a csomagon kívüli összes alosztálya számára elérhetők. Tegyük fel, hogy az Counterosztálynak van egy statikus increment()metódusa, amelynek feladata a szám növelésecountterület. Ennek a módszernek a meghívásához használhatja a Counter.increment(). Nem szükséges létrehozni az Counterosztály példányát egy statikus mező vagy metódus eléréséhez. Ez az alapvető különbség a statikus (osztály) változók és módszerek, valamint a NEM statikus (példány) változók és módszerek között. Fontos megjegyzés. Ne felejtsük el, hogy az osztály statikus tagjai közvetlenül az osztályhoz tartoznak, nem pedig az osztály bármely példányához. Vagyis a statikus countváltozó értéke minden objektumnál azonos lesz Counter. Ebben a cikkben megvizsgáljuk a statikus módosító Java-ban való használatának alapvető szempontjait, valamint néhány olyan szolgáltatást, amelyek segítenek megérteni a kulcsfontosságú programozási fogalmakat.

Amit minden programozónak tudnia kell a Java statikus módosítójáról.

Ebben a részben a statikus módszerek, mezők és osztályok használatának fő szempontjait tekintjük át. Kezdjük a változókkal.
  1. Egy statikus kontextusban, például statikus metódusban vagy blokkban NEM férhet hozzá egy osztály nem statikus tagjaihoz. Az alábbi kód összeállítása hibát eredményez:

    
    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }
    

    Ez az egyik leggyakoribb hiba, amelyet a Java programozók, különösen a kezdők követnek el. Mivel a mainmetódus statikus, a countváltozó pedig nem, a metóduson printlnbelüli metódus használata main"fordítási idő hibát" eredményez.

  2. A helyi változókkal ellentétben a statikus mezők és metódusok NINCS thread safea Java-ban. A gyakorlatban ez a biztonsági problémák egyik leggyakoribb oka a többszálú programozásban. Figyelembe véve, hogy egy osztály minden példánya egy statikus változó ugyanarra a másolatára hivatkozik, az ilyen változót az osztálynak védenie vagy „zárolnia” kell. Ezért statikus változók használatakor ügyeljen arra, hogy azok megfelelőek legyenek, synchronizedhogy elkerülje az olyan problémákat, mint pl race conditions.

  3. A statikus módszerek gyakorlati előnye, hogy nem kell minden alkalommal új objektumot létrehozni, amikor meg akarjuk hívni őket. A statikus metódus az azt deklaráló osztály nevével hívható meg. Ezért ezek a módszerek tökéletesek factorya módszerekhez és utilitymódszerekhez. Az java.lang.Mathosztály csodálatos példa: szinte minden metódusa statikus. A Java segédprogram osztályai finalugyanezen okból vannak megjelölve.

  4. Egy másik fontos szempont, hogy nem bírálhatod felül a ( @Override) statikus módszereket. Ha egy ilyen metódust deklarálunk egy subclass, azaz azonos nevű és aláírású metódusban, akkor superclassfelülírás helyett csak "elrejti" a metódusát. Ezt a jelenséget method hiding. Ez azt jelenti, hogy ha egy statikus metódus deklarálva van mind a szülő-, mind a gyermekosztályban, akkor a meghívott metódus mindig a fordításkor megnevezett változótípuson fog alapulni. A metódusok felülbírálásával ellentétben az ilyen metódusok nem kerülnek végrehajtásra a program futása közben. Nézzünk egy példát:

    
    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         } 
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         } 
    }
    
    public class Demo {   
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }
    

    Konzol kimenet:

    A szülő osztályon belül / statikus metóduson

    A kód egyértelműen mutatja, hogy annak ellenére, hogy az objektum egy Car, az osztály statikus metódusa Vehiclehívódik meg, mivel a metódus fordítási időben lett meghívva. És vegye figyelembe, hogy nem volt fordítási hiba!

  5. Sőt, a legfelső szintű osztályokon kívül az osztályokat statikusnak is deklarálhatja. Az ilyen osztályokat nested static classes. Hasznosak a jobb kohézió biztosítására. A beágyazott statikus osztály szembetűnő példája a HashMap.Entry, amely egy belső adatstruktúra HashMap. Érdemes megjegyezni, hogy a belső osztályokhoz hasonlóan a statikus beágyazott osztályokat is külön .class fájlban deklarálják. Így ha öt beágyazott osztályt deklarál a főosztályodban, akkor 6 fájlod lesz .class kiterjesztéssel. Egy másik példa a saját deklarációnk Comparator, például egy életkor-összehasonlító ( AgeComparator) az Employeeosztályban.

  6. A statikus módosító egy statikus blokkban is megadható, ismertebb nevén "statikus inicializálási blokkban", amely az osztály betöltésekor kerül végrehajtásra. Ha nem deklarál ilyen blokkot, a Java az összes statikus mezőt egyetlen listába gyűjti, és inicializálja őket az osztály betöltésekor. Egy statikus blokk NEM dobhat ellenőrzött kivételeket, de képes a nem ellenőrzött kivételeket. Ebben az esetben egy ExceptionInInitializerErrorlesz. A gyakorlatban a statikus mezők inicializálása során fellépő kivételeket a Java ebbe a hibába csomagolja. Ez a leggyakoribb oka a NoClassDefFoundError, mert az osztály nem lesz a memóriában, amikor hivatkozik rá.

  7. Hasznos tudni, hogy a statikus metódusok fordítási időben kapcsolódnak, ellentétben a virtuális vagy nem statikus metódusok összekapcsolásával, amelyek futási időben kapcsolódnak, amikor egy valós objektumra hívják őket. Ennek megfelelően a statikus metódusokat nem lehet felülírni a Java-ban, mivel a polimorfizmus nem vonatkozik rájuk futási időben. Ez egy fontos korlátozás, amelyet figyelembe kell venni, amikor egy metódust statikusnak nyilvánítunk. Ennek csak akkor van értelme, ha nincs lehetőség vagy szükség a metódus felülbírálására egy alosztályban. A gyári módszerek és a hasznossági módszerek jó példái a statikus módosító helyes használatának. Joshua Bloch számos előnyére hívja fel a figyelmet, amelyekkel a statikus gyári módszerek rendelkeznek a konstruktorokkal szemben az Effective Java című könyvében, amely minden Java programozó számára kötelező.

  8. Az inicializálás a statikus blokk egyik fontos szempontja. A statikus mezők vagy változók az osztály memóriába való betöltése után inicializálódnak. Az inicializálás sorrendje fentről lefelé, ugyanabban a sorrendben, ahogyan a Java osztály forrásfájljában deklarálva vannak. Mivel a statikus mezők inicializálása szálbiztos módon történik, ezt a folyamatot a Singletonminta megvalósítására is használják. Ha valamilyen okból nem használ egyet Enum, Singletonakkor van egy jó alternatíva. De ebben az esetben figyelembe kell vennie, hogy ez nem "lusta" inicializálás. Ez azt jelenti, hogy a statikus mezőt még MIELŐTT inicializálják, mielőtt valaki "kérné". Ha egy objektum sok erőforrást igényel, vagy ritkán használják, akkor statikus blokkban történő inicializálása nem fog az Ön javára.

  9. A szerializálás során a statikus mezők, akárcsak transienta változók, nem kerülnek sorba. Valójában, ha bármilyen adatot elment egy statikus mezőbe, az a deserializálás után tartalmazza a kezdeti (alapértelmezett) értékét. Például, ha egy statikus mező egy int, akkor értéke nulla lesz a deszerializálás után. Ha típusa float, akkor az értéke 0,0 lesz. Ha a mező egy Object, akkor az értéke null. Hogy őszinte legyek, ez az egyik leggyakrabban feltett kérdés a sorozatosítással kapcsolatban a Java-pozíciókkal kapcsolatos interjúkban. Ne tároljon lényeges objektumadatokat statikus mezőben!

  10. Végül beszéljünk a statikus importról. Ez a módosító sok hasonlóságot mutat a standard importutasítással, de abban különbözik, hogy lehetővé teszi egy vagy az összes statikus osztálytag importálását. A statikus metódusok importálása után úgy érhetők el, mintha ugyanabban az osztályban lennének deklarálva. Hasonlóképpen, statikus mezők importálásával az osztálynév megadása nélkül érhetjük el őket. Ez a funkció a Java 1.5-ben jelent meg, és megfelelő használat esetén javítja a kód olvashatóságát. Ez a konstrukció leggyakrabban a JUnit tesztekben található meg, mivel szinte minden tesztfejlesztő statikus importot használ az assert metódusokhoz, pl. assertEquals()és túlterhelt változataihoz.

  11. Ez minden most. Minden Java programozónak ismernie kell a fent említett statikus módosító összes szempontját. Ez a cikk a statikus változókkal, mezőkkel, metódusokkal, inicializálási blokkokkal és importálással kapcsolatos alapvető információkat tekinti át. Kitért néhány fontos tulajdonságra is, amelyek ismerete elengedhetetlen a Java programok írásához és megértéséhez. Remélem, hogy minden fejlesztő tökéletesíteni fogja a statikus tagok ügyes használatát, mert ez nagyon fontos a komoly szoftverfejlesztéshez."

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION