what is static keyword java
Ovaj vodič objašnjava statičnu ključnu riječ u Javi i njezinu upotrebu u varijablama, metodama, blokovima i klasama. Također navodi razliku između statičnih i nestatičnih članova:
Java podržava razne vrste deklaracija kako bi ukazala na opseg i ponašanje svojih varijabli, metoda, klasa itd. Na primjer, ključna riječ final, sealed, static itd. Sve ove deklaracije imaju neko specifično značenje kada se koriste u programu Java.
Istražit ćemo sve ove ključne riječi u nastavku ovog vodiča. Ovdje ćemo razgovarati o pojedinostima jedne od najvažnijih ključnih riječi u Javi, tj. 'Statički'.
Što ćete naučiti:
- Statična ključna riječ u Javi
- Zaključak
Statična ključna riječ u Javi
Član u Java programu može se proglasiti statičkim pomoću ključne riječi 'static' koja prethodi njegovoj deklaraciji / definiciji. Kad je član proglašen statičkim, to u osnovi znači da ga član dijele sve instance klase bez kopiranja po instanci.
Stoga je static ne-klasni modifikator koji se koristi u Javi i može se primijeniti na sljedeće članove:
- Varijable
- Metode
- Blokovi
- Predavanja (točnije, ugniježđene klase)
Kad je član proglašen statičkim, može mu se pristupiti bez upotrebe objekta. To znači da je prije instancije klase statični član aktivan i dostupan. Za razliku od ostalih nestatičnih članova klase koji prestaju postojati kad objekt klase izađe iz opsega, statični je član i dalje očito aktivan.
Statička varijabla u Javi
Varijabla člana klase koja je deklarirana kao statička naziva se statička varijabla. Također se naziva i 'varijabla klase'. Jednom kada je varijabla deklarirana kao statička, memorija se dodjeljuje samo jednom, a ne svaki put kada se klasa instancira. Stoga statičnoj varijabli možete pristupiti bez reference na objekt.
Sljedeći Java program prikazuje upotrebu statičkih varijabli:
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); } }
Izlaz:
U gornjem programu imamo dvije statičke varijable tj. A i b. Te varijable mijenjamo u funkciji 'printStatic', kao i u 'main'. Imajte na umu da se vrijednosti ovih statičkih varijabli čuvaju u svim funkcijama čak i kad opseg funkcije završi. Izlaz prikazuje vrijednosti varijabli u dvije funkcije.
Zašto su nam potrebne statičke varijable i gdje su korisne?
Statičke varijable su najkorisnije u aplikacijama koje trebaju brojače. Kao što znate, brojači će dati pogrešne vrijednosti ako su deklarirani kao normalne varijable.
Na primjer, ako imate normalnu varijablu postavljenu kao brojač u aplikaciji koja ima klasu recimo auto. Tada, kad god kreiramo automobilski objekt, normalna varijabla brojača inicijalizirat će se sa svakom instancom. Ali ako imamo varijablu brojača kao statičku ili varijablu klase, ona će se inicijalizirati samo jednom kada se klasa kreira.
Kasnije će se svaki brojač klase povećavati za jedan. To je za razliku od normalne varijable, kod koje će se brojač povećavati, ali će vrijednost brojača uvijek biti 1.
Dakle, čak i ako kreirate stotinu predmeta klase automobila, tada će brojač kao normalna varijabla uvijek imati vrijednost 1, dok će sa statičkom varijablom prikazivati točan broj od 100.
Dolje je dat još jedan primjer statičkih brojača u Javi:
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(); } }
Izlaz:
Rad statičke varijable vidljiv je u gornjem programu. Proglasili smo statičku varijablu count s početnom vrijednošću = 0. Zatim u konstruktoru klase povećavamo statičku varijablu.
U glavnoj funkciji kreiramo tri objekta brojača klasa. Izlaz prikazuje vrijednost statičke varijable svaki put kada se kreira objekt brojača. Vidimo da se sa svakim stvorenim objektom postojeća vrijednost statičke varijable povećava, a ne ponovno inicijalizira.
Java statička metoda
Metoda u Javi je statična kada joj prethodi ključna riječ 'static'.
Neke točke kojih se morate sjetiti o statičkoj metodi uključuju:
koji je najbolji besplatni čistač registra
- Statička metoda pripada klasi u odnosu na druge ne-statičke metode koje se pozivaju pomoću instance klase.
- Da biste pozvali statičku metodu, ne trebate objekt klase.
- Statički podaci klase dostupni su statičkoj metodi. Statička metoda može čak mijenjati vrijednosti člana statičnog podatka.
- Statička metoda ne može imati referencu na 'ovaj' ili 'super' član. Čak i ako ih pokuša statička metoda uputiti, to će biti pogreška kompajlera.
- Baš kao i statički podaci, statička metoda može pozvati i druge statičke metode.
- Statička metoda ne može se odnositi na nestatične članove podataka ili varijable, a ne može pozivati i nestatične metode.
Sljedeći program prikazuje implementaciju statičke metode u Javi:
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(); } }
Izlaz:
Ovo je jednostavna ilustracija. Definiramo statičku metodu koja jednostavno ispisuje poruku. Tada se u glavnoj funkciji poziva statička metoda bez ikakvog objekta ili instance klase.
Još jedan primjer implementacije statičke ključne riječi u Javi.
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(); } }
Kao što vidite, u gornjem programu imamo dvije metode. Metoda printStaticje statička metoda, dok je inst_print instancijska metoda. Također imamo dvije varijable, static_count je statička varijabla, a b je varijabla instance.
U statičkoj metodi - printStatic, prvo prikazujemo poruku, a zatim pokušavamo promijeniti vrijednost varijable instance b i također pozivamo ne-statičku metodu.
Dalje, pokušavamo upotrijebiti ključnu riječ 'super'.
b = 20;
inst_print ();
System.out.println (super.count_static);
Kada izvršavamo program s gornjim redovima, dobivamo pogreške pri kompilaciji za korištenje varijabli instance, pozivanje nestatičnih metoda i upućivanje super u statički kontekst. To su ograničenja statičke metode.
Kad komentiramo gornja tri retka, tek tada gornji program radi u redu i daje sljedeće rezultate.
Izlaz:
Preopterećenje i poništavanje statičke metode
Kao što svi znate, i preopterećenje i prenamjena značajke su OOPS-a i pomažu u polimorfizmu. Preopterećenje se može klasificirati kao polimorfizam vremena kompajliranja pri čemu možete imati metode s istim nazivom, ali različitim popisima parametara.
Nadjačavanje je značajka polimorfizma vremena izvođenja i u tome je metoda osnovne klase nadjačana u izvedenoj klasi tako da je potpis ili prototip metode isti, ali se definicija razlikuje.
Razgovarajmo o tome kako preopterećenje i nadjačavanje utječu na statičku klasu u Javi.
Preopterećenje
Statičku metodu u Javi možete preopteretiti različitim popisima parametara, ali s istim imenom.
Sljedeći program prikazuje Preopterećenje:
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!!'); } }
Izlaz:
Ovaj program ima dvije statičke metode s istim nazivom ‘static_method’, ali različit popis argumenata. Prva metoda ne uzima nijedan argument, a druga metoda uzima argument niza.
Treba napomenuti da metodu ne možete preopteretiti samo ovisno o ključnoj riječi 'static'. Na primjer, ako imate metodu instance 'sum' i ako definirate drugu metodu 'sum' i proglasite je statičnom, onda to neće raditi. Ovaj pokušaj preopterećenja na temelju 'statične' ključne riječi rezultirat će neuspjehom kompilacije.
Nadjačavanje
Kako se statičke metode pozivaju bez ikakvog objekta klase, čak i ako imate statičku metodu s istim potpisom u izvedenoj klasi, ona neće biti nadjačana. To je zato što nema polimorfizma tijekom izvođenja bez instance.
Stoga ne možete nadjačati statičku metodu. Ali ako uopće postoji statička metoda s istim potpisom u izvedenoj klasi, tada metoda za pozivanje ne ovisi o objektima u vremenu izvođenja, već ovisi o prevoditelju.
Morate napomenuti da, iako se statičke metode ne mogu nadjačati, jezik Java ne daje nikakve pogreške kompajlera kada imate metodu u izvedenoj klasi s istim potpisom kao metoda osnovne klase.
Sljedeća provedba 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(); } }
Izlaz:
U gornjem programu možete vidjeti da pozvana statička metoda ne ovisi o tome na koji objekt pokazuje pokazivač. To je zato što se objekti uopće ne koriste statičkim metodama.
Statički blok u Javi
Baš kao što imate funkcionalne blokove u programskim jezicima kao što su C ++, C #, itd., I na Javi postoji i poseban blok koji se naziva 'statički' blok koji obično uključuje blok koda povezan sa statičkim podacima.
Ovaj se statički blok izvršava u trenutku kada se kreira prvi objekt klase (upravo u vrijeme učitavanja klase) ili kada se koristi statički član unutar bloka.
Sljedeći program prikazuje upotrebu statičkog bloka.
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); } }
Izlaz:
Obratite pažnju na redoslijed izvršavanja izjava u gore navedenom programu. Prvo se izvršava sadržaj statičkog bloka, a zatim glavni program. Statičke varijable sum i val1 imaju početne vrijednosti dok val2 nije inicijaliziran (zadana je vrijednost 0). Tada u statičkom bloku val2 još uvijek nije dodijeljena vrijednost i stoga je njegova vrijednost prikazana kao 0.
Varijabli val2 dodjeljuje se vrijednost nakon ispisa u statičkom bloku i zbroj se izračunava. Stoga u glavnoj funkciji dobivamo različite vrijednosti zbroja i val2.
koji je najbolji računalni operativni sustav
Ako navedete konstruktor, tada se sadržaj statičkog bloka izvršava i prije konstruktora. Statički blokovi uglavnom se koriste za inicijalizaciju statičkih članova klase i ostalih inicijalizacija povezanih sa statičkim članovima.
Java statička klasa
U Javi imate statičke blokove, statičke metode, pa čak i statičke varijable. Stoga je očito da možete imati i statičke klase. U Javi je moguće imati klasu unutar druge klase i to se naziva ugniježđena klasa. Klasa koja zatvara ugniježđenu klasu naziva se vanjska klasa.
U Javi, iako ugniježđenu klasu možete proglasiti statičnom, vanjsku klasu nije moguće imati kao statičku.
Istražimo sada statične ugniježđene klase u Javi.
Statična ugniježđena klasa u Javi
Kao što je već spomenuto, ugniježđenu klasu u Javi možete proglasiti statičnom. Statična ugniježđena klasa razlikuje se od nestetičke ugniježđene klase (unutarnja klasa) u određenim aspektima kako su navedeni u nastavku.
Za razliku od nestetičke ugniježđene klase, ugniježđenoj statičkoj klasi nije potrebna vanjska referenca klase.
Statična ugniježđena klasa može pristupiti samo statičkim članovima vanjske klase nasuprot ne-statičkim klasama koje mogu pristupiti statičkim, ali i statičkim članovima vanjske klase.
Primjer statičke ugniježđene klase dan je u nastavku.
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(); } }
Izlaz:
U gornjem programu vidite da statična ugniježđena klasa može pristupiti statičkoj varijabli (nizu) iz vanjske klase.
Statički uvoz u Javi
Kao što znate, obično uključujemo razne pakete i unaprijed definiranu funkcionalnost u Java program pomoću direktive 'import'. Korištenje riječi static s direktivom o uvozu omogućuje vam upotrebu funkcije klase bez korištenja naziva klase.
Primjer:
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'); } }
Izlaz:
pitanja za intervju za testiranje softvera za iskusne kandidate
U ovom programu koristimo statički uvoz za klasu java.lang.System.
Bilješka: U glavnoj funkciji upravo smo upotrijebili out.println za prikaz poruke.
Iako značajka statičkog uvoza čini kôd sažetijim i čitljivijim, ponekad stvara dvosmislenost, posebno kada neki paketi imaju iste funkcije. Stoga se statički uvoz treba koristiti samo kada je krajnje potreban.
Statičko vs nestatično
Razgovarajmo o glavnim razlikama između statičnih i nestatičnih članova Jave.
U nastavku su navedene razlike između Statičke i nestatičke varijable .
Statičke varijable | Nestatičke varijable |
---|---|
Može mu se pristupiti samo pomoću naziva klase. | Zahtijeva objekte klase za pristup. |
Dostupne su kako statičkim, tako i nestatičkim metodama. | Dostupni su samo nesстатиčkim metodama. |
Memorija za statičku varijablu dodjeljuje se samo jednom po klasi. | Po objektu se dodjeljuje memorija za nestatične varijable. |
Dijele ga svi objekti klase. | Izrađuje se kopija varijable po objektu. |
Ima globalni opseg i dostupan je svim metodama i blokovima. | Lokalni je opseg i vidljiv je objektima klase. |
Dolje je dana razlika između statičkih i nestatičkih metoda .
Statičke metode | Nestatičke metode |
---|---|
Metoda kojoj prethodi statična ključna riječ i dostupna je na razini klase. | Metoda kojoj ne prethodi statična ključna riječ i dostupna za svaku instancu klase. |
Podržava vrijeme kompajliranja ili rano povezivanje. | Podržava vrijeme izvođenja ili dinamičko vezanje. |
Može pristupiti samo statičkim podacima članova svoje klase i bilo koje druge klase. | Može pristupiti statičkim, ali i statičkim članovima klase i drugim klasama. |
Statičke metode ne mogu se nadjačati. | Može se nadjačati. |
Memorija se dodjeljuje samo jednom. Stoga je manje memorije koja se koristi. | Potrošnja memorije veća je jer se memorija dodjeljuje svaki put kada se metoda pozove. |
Statička vs konačna
Static i Final dvije su ključne riječi u Javi koje entitetu s kojim se koristi mogu dati posebno značenje. Na primjer, kada je varijabla deklarirana kao statična, ona postaje varijabla klase kojoj se može pristupiti bez pozivanja na objekt.
Slično tome, kada je varijabla proglašena konačnom, ona postaje nepromjenjiva, tj. Konstanta.
Idemo tabularizirati neke od glavnih razlika između statičnih i završnih ključnih riječi u Javi.
Statički | Konačno |
---|---|
Statički član podataka (ugniježđena klasa, varijabla ili metoda) je član podataka kojem prethodi statična ključna riječ i može mu se pristupiti bez objekta. | Posljednja ključna riječ može se primijeniti na varijablu, metodu, klasu itd. i nameće ograničenja entitetima. |
Nije obvezno inicijalizirati statičku varijablu vrijednošću tijekom deklaracije. | Potrebno je da se konačna varijabla inicijalizira u vrijednost u trenutku deklaracije |
Možete ponovno inicijalizirati statičke varijable. | Nije moguće ponovno inicijalizirati konačne varijable. |
Statičke metode su one koje mogu pristupiti samo statičkim članovima. | Konačne metode su metode koje se ne mogu naslijediti / nadjačati. |
Statičke klase su klase čiji se objekti ne mogu kreirati. | Završni razredi su razredi koji se ne mogu naslijediti. |
Često postavljana pitanja
P # 1) Može li Java klasa biti statična?
Odgovor: Da, klasa u Javi može biti statična, pod uvjetom da nije vanjska klasa. To znači da statične mogu biti samo ugniježđene klase u Javi.
P # 2) Kada trebam koristiti Static u Javi?
Odgovor: Kad god želite člana podataka u svom programu koji bi trebao zadržati vrijednost na objektima, tada biste trebali koristiti statički. Na primjer, brojač. Metoda se može proglasiti statičnom kada je ne želite pozivati pomoću objekta.
P # 3) Može li statička klasa imati konstruktor?
Odgovor: Da, statička klasa može imati konstruktor i svrha joj je isključivo inicijalizacija statičkih članova podataka. Pozvat će se samo prvi put kada se pristupi članovima podataka. Neće se pozivati za naknadni pristup.
P # 4) Čemu služi Statički konstruktor?
Odgovor: Općenito, konstruktor se koristi za inicijalizaciju statičkih članova podataka. Također se koristi za izvođenje operacija / radnji koje je potrebno izvršiti samo jednom.
P # 5) Jesu li statične metode naslijeđene u Javi?
Odgovor: Da, statičke metode u Javi su naslijeđene, ali nisu nadjačane.
Zaključak
U ovom uputstvu detaljno smo raspravljali o statičkoj ključnoj riječi Java zajedno s njezinom uporabom u članovima podataka, metodama, blokovima i klasama. Ključna riječ static je ključna riječ koja se koristi za označavanje razine klase ili globalnog opsega.
Ne trebate pristupati statičkim članovima pomoću instanci klase. Članovima statičkih podataka možete izravno pristupiti pomoću naziva klase. Također smo razgovarali o glavnim razlikama između statičnih i nestatičnih članova kao i o statičkim i završnim ključnim riječima.
U sljedećim temama istražit ćemo više ključnih riječi i njihov značaj u jeziku Java.
Preporučena literatura
- Statički u C ++
- Java sučelje i udžbenik sažetka klase s primjerima
- Implementacija Jave: Izrada i izvršavanje Java JAR datoteke
- Java virtualni stroj: kako JVM pomaže u pokretanju Java aplikacije
- C # koncepti: konstruktor, destruktor, statička klasa, struktura i nabrajanje
- Pristupiti modifikatorima u Javi - Vodič s primjerima
- Java Vodič za refleksiju s primjerima
- Uvod u programski jezik Java - Video vodič