what is static keyword java
Tento výukový program vysvetľuje statické kľúčové slovo v jazyku Java a jeho použitie v premenných, metódach, blokoch a triedach. Uvádza tiež rozdiel medzi statickými a nestatickými členmi:
Java podporuje rôzne typy vyhlásení, ktoré označujú rozsah a správanie jej premenných, metód, tried atď. Napríklad, kľúčové slovo konečná, zapečatená, statická atď. Všetky tieto vyhlásenia majú určitý špecifický význam, ak sa používajú v programe Java.
Ako budeme pokračovať v tomto návode, preskúmame všetky tieto kľúčové slová. Tu si povieme niečo o jednom z najdôležitejších kľúčových slov v Jave, teda „statické“.
Čo sa dozviete:
- Statické kľúčové slovo v prostredí Java
- Záver
Statické kľúčové slovo v prostredí Java
Člen programu Java môže byť deklarovaný ako statický pomocou kľúčového slova „static“, ktoré predchádza jeho deklarácii / definícii. Keď je člen vyhlásený za statický, znamená to v podstate to, že je člen zdieľaný vo všetkých inštanciách triedy bez vytvárania kópií jednotlivých inštancií.
Statický je teda neklasický modifikátor používaný v Jave a dá sa použiť na nasledujúcich členov:
- Premenné
- Metódy
- Bloky
- Triedy (presnejšie vnorené triedy)
Keď je člen vyhlásený za statický, potom k nemu možno získať prístup bez použitia objektu. To znamená, že pred vytvorením inštancie triedy je statický člen aktívny a prístupný. Na rozdiel od ostatných členov triedy, ktorí nie sú statickí, ktorí prestanú existovať, keď objekt triedy vypadne z rozsahu, statický člen je stále zjavne aktívny.
Statická premenná v Jave
Členská premenná triedy, ktorá je deklarovaná ako statická, sa nazýva statická premenná. Nazýva sa tiež ako „premenná triedy“. Keď je premenná deklarovaná ako statická, pamäť sa pridelí iba raz a nie vždy, keď sa vytvorí inštancia triedy. Preto máte prístup k statickej premennej bez odkazu na objekt.
Nasledujúci program Java zobrazuje použitie statických premenných:
class Main { // static variables a and b static int a = 10; static int b; static void printStatic() { a = a /2; b = a; System.out.println('printStatic::Value of a : '+a + ' Value of b : '+b); } public static void main(String() args) { printStatic(); b = a*5; a++; System.out.println('main::Value of a : '+a + ' Value of b : '+b); } }
Výkon:
Vo vyššie uvedenom programe máme dve statické premenné, t.j. a a b. Tieto premenné upravujeme vo funkcii „printStatic“ aj „main“. Upozorňujeme, že hodnoty týchto statických premenných sa vo funkciách zachovajú, aj keď sa rozsah funkcie skončí. Výstup zobrazuje hodnoty premenných v dvoch funkciách.
Prečo potrebujeme statické premenné a kde sú užitočné?
Statické premenné sú najužitočnejšie v aplikáciách, ktoré potrebujú počítadlá. Ako viete, počítadlá poskytnú nesprávne hodnoty, ak sú deklarované ako normálne premenné.
Napríklad ak máte normálnu premennú nastavenú ako počítadlo v aplikácii, ktorá má triedu povedzme auto. Potom, kedykoľvek vytvoríme objekt automobilu, bude sa premenná normálneho počítadla inicializovať s každou inštanciou. Ale ak máme premennú počítadla ako statickú alebo premennú triedy, potom sa inicializuje iba raz, keď sa vytvorí trieda.
Neskôr, s každou inštanciou triedy, sa toto počítadlo zvýši o jednu. Je to na rozdiel od normálnej premennej, pričom s každou inštanciou sa počítadlo zvýši, ale hodnota počítadla bude vždy 1.
Preto aj keď vytvoríte sto objektov triedy auta, potom počítadlo ako normálna premenná bude mať vždy hodnotu 1, zatiaľ čo so statickou premennou bude zobrazovať správny počet 100.
Nižšie je uvedený ďalší príklad statických počítadiel v Jave:
class Counter { static int count=0;//will get memory only once and retain its value Counter() { count++;//incrementing the value of static variable System.out.println(count); } } class Main { public static void main(String args()) { System.out.println('Values of static counter:'); Counter c1=new Counter(); Counter c2=new Counter(); Counter c3=new Counter(); } }
Výkon:
Fungovanie statickej premennej je zrejmé z vyššie uvedeného programu. Počet statických premenných sme deklarovali s počiatočnou hodnotou = 0. Potom v konštruktore triedy zvýšime statickú premennú.
V hlavnej funkcii vytvoríme tri objekty počítadla tried. Výstup zobrazuje hodnotu statickej premennej zakaždým, keď sa vytvorí objekt počítadla. Vidíme, že s každým vytvoreným objektom sa existujúca hodnota statickej premennej zvyšuje a nereinicializuje.
Statická metóda Java
Metóda v jazyku Java je statická, ak jej predchádza kľúčové slovo „static“.
Niektoré body, ktoré si musíte pamätať pri statickej metóde, sú:
otázky a odpovede s technikom zabezpečujúcim kvalitu
- Statická metóda patrí do triedy oproti iným nestatickým metódam, ktoré sa vyvolávajú pomocou inštancie triedy.
- Na vyvolanie statickej metódy nepotrebujete objekt triedy.
- Statické dátové členy triedy sú prístupné statickej metóde. Statická metóda môže dokonca zmeniť hodnoty člena statických údajov.
- Statická metóda nemôže mať odkaz na členov „this“ alebo „super“. Aj keď sa ich statická metóda pokúsi sprostredkovať, bude to chyba kompilátora.
- Rovnako ako statické údaje, môže statická metóda volať aj iné statické metódy.
- Statická metóda nemôže odkazovať na nestatické dátové členy alebo premenné a nemôže volať aj nestatické metódy.
Nasledujúci program ukazuje implementáciu statickej metódy v prostredí Java:
class Main { // static method static void static_method() { System.out.println('Static method in Java...called without any object'); } public static void main(String() args) { static_method(); } }
Výkon:
Toto je jednoduchá ilustrácia. Definujeme statickú metódu, ktorá správu jednoducho vytlačí. Potom sa v hlavnej funkcii volá statická metóda bez akéhokoľvek objektu alebo inštancie triedy.
Ďalší príklad implementácie statického kľúčového slova v Jave.
class Main { // static variable static int count_static = 5; // instance variable int b = 10; // static method static void printStatic() { count_static = 20; System.out.println('static method printStatic'); // b = 20; // compilation error 'error: non-static variable b cannot be referenced from a static context' //inst_print(); // compilation error 'non-static method inst_print() cannot be referenced from a static //context' //System.out.println(super.count_static); // compiler error 'non-static variable super cannot be //referenced from a static context' } // instance method void inst_print() { System.out.println('instance method inst_print'); } public static void main(String() args) { printStatic(); } }
Ako vidíte vo vyššie uvedenom programe, máme dve metódy. Metóda printStaticje statická metóda, zatiaľ čo inst_print je inštančná metóda. Máme tiež dve premenné, static_count je statická premenná ab je premenná inštancie.
V statickej metóde - printStatic najskôr zobrazíme správu a potom sa pokúsime zmeniť hodnotu inštančnej premennej b a zavoláme aj nestatickú metódu.
Ďalej skúsime použiť kľúčové slovo „super“.
b = 20;
inst_print ();
System.out.println (super.count_static);
najlepší sťahovač mp3 pre telefón s Androidom
Keď vykonáme program s vyššie uvedenými riadkami, dostaneme chyby kompilácie pre použitie premenných inštancie, volanie nestatických metód a superodkazovanie v statickom kontexte. Toto sú obmedzenia statickej metódy.
Keď komentujeme vyššie uvedené tri riadky, vyššie uvedený program funguje dobre a vytvorí nasledujúci výstup.
Výkon:
Preťaženie a potlačenie statickej metódy
Ako všetci viete, preťaženie aj prepisovanie sú vlastnosťami OOPS a pomáhajú pri polymorfizme. Preťaženie možno klasifikovať ako polymorfizmus v čase kompilácie, pričom môžete mať metódy s rovnakým názvom, ale s rôznymi zoznamami parametrov.
Prepísanie je vlastnosťou polymorfizmu za behu a v tomto je metóda základnej triedy prepísaná v odvodenej triede, takže podpis alebo prototyp metódy sú rovnaké, ale definícia sa líši.
Poďme diskutovať o tom, ako preťaženie a prepísanie ovplyvňujú statickú triedu v Jave.
Preťaženie
Statickú metódu v Java môžete preťažiť rôznymi zoznamami parametrov, ale s rovnakým názvom.
Nasledujúci program zobrazuje preťaženie:
public class Main { public static void static_method() { System.out.println('static_method called '); } public static void static_method(String msg) { System.out.println('static_method(string) called with ' + msg); } public static void main(String args()) { static_method(); static_method('Hello, World!!'); } }
Výkon:
Tento program má dve statické metódy s rovnakým názvom „static_method“, ale s iným zoznamom argumentov. Prvá metóda neberie žiadny argument a druhá metóda prijíma reťazcový argument.
Je potrebné poznamenať, že metódu nemôžete preťažiť iba v závislosti od kľúčového slova „static“. Napríklad, ak máte inštančnú metódu „sum“ a ak definujete inú metódu „sum“ a deklarujete ju ako statickú, nebude to fungovať. Tento pokus o preťaženie na základe „statického“ kľúčového slova bude mať za následok zlyhanie kompilácie.
Naliehavé
Pretože sú vyvolané statické metódy bez akéhokoľvek objektu triedy, aj keď máte v odvodenej triede statickú metódu s rovnakým podpisom, nebude to mať prednosť. Je to preto, že bez inštancie neexistuje žiadny runtime polymorfizmus.
Preto nemôžete prepísať statickú metódu. Pokiaľ ale v odvodenej triede vôbec existuje statická metóda s rovnakým podpisom, potom metóda volania nezávisí od objektov za behu, ale závisí od kompilátora.
Musíte si uvedomiť, že aj keď nemožno prepísať statické metódy, jazyk Java nedáva chyby kompilátora, ak máte v odvodenej triede metódu s rovnakým podpisom ako metóda základnej triedy.
Nasledujúca implementácia to dokazuje.
classBase_Class { // Static method in base class which will be hidden in substatic_displayclass public static void static_display() { System.out.println('Base_Class::static_display'); } } classDerived_Class extends Base_Class { public static void static_display() { System.out.println('Derived_Class::static_display'); } } public class Main { public static void main(String args( )) { Base_Class obj1 = new Base_Class(); Base_Class obj2 = new Derived_Class(); Derived_Class obj3 = new Derived_Class(); obj1.static_display(); obj2.static_display(); obj3.static_display(); } }
Výkon:
Vo vyššie uvedenom programe môžete vidieť, že volaná statická metóda nezávisí od toho, na ktorý objekt ukazovateľ ukazuje. Je to tak preto, lebo statické metódy vôbec nepoužívajú objekty.
Statický blok v Jave
Rovnako ako v Java máte funkčné bloky v programovacích jazykoch ako C ++, C # atď., Existuje aj špeciálny blok s názvom „statický“ blok, ktorý zvyčajne obsahuje blok kódu súvisiaci so statickými údajmi.
Tento statický blok sa vykoná v okamihu, keď sa vytvorí prvý objekt triedy (presne v čase načítania triedy) alebo keď sa použije statický člen vo vnútri bloku.
Nasledujúci program ukazuje použitie statického bloku.
class Main { static int sum = 0; static int val1 = 5; static int val2; // static block static { sum = val1 + val2; System.out.println('In static block, val1: ' + val1 + ' val2: '+ val2 + ' sum:' + sum); val2 = val1 * 3; sum = val1 + val2; } public static void main(String() args) { System.out.println('In main function, val1: ' + val1 + ' val2: '+ val2 + ' sum:' + sum); } }
Výkon:
Všimnite si poradie vykonávania príkazov vo vyššie uvedenom programe. Najskôr sa vykoná obsah statického bloku a potom hlavný program. Statické premenné sum a val1 majú počiatočné hodnoty, zatiaľ čo val2 nie je inicializovaný (predvolené je 0). Potom v statickom bloku val2 stále nemá priradenú hodnotu, a preto sa jeho hodnota zobrazuje ako 0.
Premennej val2 je po vytlačení v statickom bloku priradená hodnota a súčet sa prepočíta. Preto v hlavnej funkcii dostaneme rôzne hodnoty súčtu a val2.
Ak zadáte konštruktor, potom sa obsah statického bloku vykoná ešte pred konštruktorom. Statické bloky sa väčšinou používajú na inicializáciu statických členov triedy a ďalšiu inicializáciu súvisiacu so statickými členmi.
Statická trieda Java
V Jave máte statické bloky, statické metódy a dokonca aj statické premenné. Je preto zrejmé, že môžete mať aj statické triedy. V prostredí Java je možné mať triedu vo vnútri inej triedy, ktorá sa nazýva vnorená trieda. Trieda, ktorá uzatvára vnorenú triedu, sa nazýva vonkajšia trieda.
Aj keď v Jave môžete vnorenú triedu vyhlásiť za statickú, nie je možné, aby vonkajšia trieda bola statická.
Poďme sa teraz pozrieť na statické vnorené triedy v Jave.
Statická vnorená trieda v Jave
Ako už bolo spomenuté, vnorenú triedu v Jave môžete mať deklarovanú ako statickú. Statická vnorená trieda sa líši od nestatickej vnorenej triedy (vnútorná trieda) v určitých aspektoch, ktoré sú uvedené nižšie.
Na rozdiel od nestatickej vnorenej triedy, vnorená statická trieda nepotrebuje odkaz na vonkajšiu triedu.
Statická vnorená trieda má prístup iba k statickým členom vonkajšej triedy oproti nestatickým triedam, ktoré majú prístup k statickým aj nestatickým členom vonkajšej triedy.
Nižšie je uvedený príklad statickej vnorenej triedy.
class Main{ private static String str = 'SoftwareTestingHelp'; //Static nested class static class NestedClass{ //non-static method public void display() { System.out.println('Static string in OuterClass: ' + str); } } public static void main(String args()) { Main.NestedClassobj = new Main.NestedClass(); obj.display(); } }
Výkon:
Vo vyššie uvedenom programe vidíte, že statická vnorená trieda má prístup k statickej premennej (reťazcu) z vonkajšej triedy.
Statický import v Jave
Ako viete, do programu Java zvyčajne zahrňujeme rôzne balíčky a preddefinované funkcie pomocou smernice „import“. Použitie slova static s importnou smernicou vám umožňuje používať funkcionalitu triedy bez použitia názvu triedy.
Príklad:
import static java.lang.System.*; class Main { public static void main(String() args) { //here we import System class using static, hence we can directly use functionality out.println('demonstrating static import'); } }
Výkon:
V tomto programe používame statický import pre triedu java.lang.System.
Poznámka: V hlavnej funkcii sme práve použili out.println na zobrazenie správy.
Aj keď funkcia statického importu robí kód stručnejším a čitateľnejším, niekedy vytvára nejednoznačnosť, najmä ak majú niektoré balíky rovnaké funkcie. Statický import by sa mal preto používať iba v nevyhnutných prípadoch.
Statický vs Nestatický
Poďme diskutovať o hlavných rozdieloch medzi statickými a nestatickými členmi Javy.
Nižšie sú uvedené rozdiely medzi Statické a nestatické premenné .
otázky a odpovede na pohovor o zabezpečení kvality
Statické premenné | Nestatické premenné |
---|---|
Prístup k nim je možný iba pomocou názvu triedy. | Vyžaduje prístup k objektom triedy. |
Sú prístupné tak statickým, ako aj nestatickým metódam. | Sú prístupné iba nestatickými metódami. |
Pamäť pre statickú premennú je pre triedu pridelená iba raz. | Pamäť pre nestatické premenné je pridelená každému objektu. |
Zdieľané všetkými objektmi triedy. | Vytvorí sa kópia premennej na objekt. |
Má globálny rozsah a je k dispozícii pre všetky metódy a bloky. | Má miestny rozsah a je viditeľný pre objekty triedy. |
Ďalej je uvedený rozdiel medzi statickými a nestatickými metódami .
Statické metódy | Nestatické metódy |
---|---|
Metóda, ktorej predchádza statické kľúčové slovo a je k dispozícii na úrovni triedy. | Metóda, ktorej nepredchádza statické kľúčové slovo a je k dispozícii pre každú inštanciu triedy. |
Podporuje kompiláciu alebo skorú väzbu. | Podporuje run-time alebo dynamické viazanie. |
Má prístup iba k členom statických údajov svojej triedy a akejkoľvek inej triedy. | Má prístup k statickým aj nestatickým členom triedy a ďalších tried. |
Statické metódy nemožno prepísať. | Dá sa prepísať. |
Pamäť je pridelená iba raz. Preto je použitá pamäť menšia. | Spotreba pamäte je vyššia, pretože pamäť je pridelená zakaždým, keď je metóda vyvolaná. |
Statický vs konečný
Statické a konečné sú dve kľúčové slová v Jave, ktoré môžu dať osobitný význam entite, s ktorou sa používa. Napríklad, keď je premenná deklarovaná ako statická, stane sa premennou triedy, ku ktorej je možné pristupovať bez odkazu na objekt.
Podobne, keď je premenná vyhlásená za konečnú, stáva sa nemennou, t. J. Konštantou.
Uveďme tabuľku niekoľkých hlavných rozdielov medzi statickými a záverečnými kľúčovými slovami v Jave.
Statický | Konečný |
---|---|
Statický dátový člen (vnorená trieda, premenná alebo metóda) je dátový člen, ktorému predchádza kľúčové slovo static a je k nemu prístup bez objektu. | Výsledné kľúčové slovo je možné použiť na premennú, metódu, triedu atď. a ukladá subjektom obmedzenia. |
Inicializácia statickej premennej s hodnotou počas deklarácie nie je povinná. | Je potrebné, aby bola finálna premenná inicializovaná na hodnotu v čase deklarácie |
Môžete znova inicializovať statické premenné. | Nie je možné reinicializovať konečné premenné. |
Statické metódy sú tie, ktoré majú prístup iba k statickým členom. | Konečné metódy sú metódy, ktoré nemožno dediť / prepísať. |
Statické triedy sú triedy, ktorých objekty nie je možné vytvoriť. | Záverečné triedy sú triedy, ktoré sa nedajú dediť. |
často kladené otázky
Otázka č. 1) Môže byť trieda Java statická?
Odpoveď: Áno, trieda v Jave môže byť statická, ak nejde o vonkajšiu triedu. To znamená, že statické môžu byť iba vnorené triedy v Jave.
Otázka č. 2) Kedy mám použiť statický v Jave?
Odpoveď: Kedykoľvek chcete vo svojom programe údajový člen, ktorý by mal udržiavať svoju hodnotu naprieč objektmi, mali by ste použiť statický. Napríklad, pult. Metódu je možné vyhlásiť za statickú, ak ju nechcete vyvolať pomocou objektu.
Otázka 3) Môže mať statická trieda konštruktor?
Odpoveď: Áno, statická trieda môže mať konštruktor a jej účelom je výlučne inicializácia členov statických údajov. Vyvolá sa iba po prvý raz pri prístupe k dátovým členom. Pri ďalšom prístupe nebude vyvolaná.
Otázka č. 4) Na čo slúži program Static Constructor?
Odpoveď: Všeobecne sa konštruktor používa na inicializáciu členov statických údajov. Používa sa tiež na vykonávanie operácií / akcií, ktoré je potrebné vykonať iba raz.
Otázka č. 5) Dedia sa statické metódy v Jave?
Odpoveď: Áno, statické metódy v Jave sa dedia, ale nie sú prepísané.
Záver
V tomto tutoriáli sme podrobne diskutovali o statickom kľúčovom slove Java spolu s jeho použitím v dátových členoch, metódach, blokoch a triedach. Statické kľúčové slovo je kľúčové slovo, ktoré sa používa na označenie úrovne triedy alebo globálneho rozsahu.
K statickým členom nemusíte pristupovať pomocou inštancií triedy. K členom statických údajov môžete získať priamy prístup pomocou názvu triedy. Diskutovali sme tiež o hlavných rozdieloch medzi statickými a nestatickými členmi, ako aj o statických a konečných kľúčových slovách.
V našich nasledujúcich témach preskúmame viac kľúčových slov a ich význam v jazyku Java.
Odporúčané čítanie
- Statické v C ++
- Príručka k rozhraniu Java a abstraktnej triede
- Nasadenie Java: Vytvorenie a vykonanie súboru Java JAR
- Virtuálny stroj Java: Ako JVM pomáha pri spúšťaní aplikácií Java
- Koncepty C #: Constructor, Destructor, Static Class, Struct & Enum
- Modifikátory prístupu v prostredí Java - návod s príkladmi
- Výukový program Java Reflection s príkladmi
- Úvod do programovacieho jazyka Java - videonávod