what is static keyword java
Denne opplæringen forklarer statiske nøkkelord i Java og bruken av den i variabler, metoder, blokker og klasser. Angir også forskjellen mellom statiske og ikke-statiske medlemmer:
Java støtter forskjellige typer erklæringer for å indikere omfanget og oppførselen til variablene, metodene, klassene osv. For eksempel, nøkkelordet endelig, forseglet, statisk, osv. Alle disse erklæringene har en viss spesifikk betydning når de brukes i Java-programmet.
Vi vil utforske alle disse søkeordene når vi fortsetter med denne veiledningen. Her vil vi diskutere detaljene til et av de viktigste nøkkelordene i Java, dvs. 'statisk'.
Hva du vil lære:
- Statisk nøkkelord i Java
- Konklusjon
Statisk nøkkelord i Java
Et medlem i et Java-program kan erklæres som statisk ved å bruke nøkkelordet 'statisk' foran erklæringen / definisjonen. Når et medlem blir erklært statisk, betyr det egentlig at medlemmet deles av alle forekomster av en klasse uten å lage kopier av per forekomst.
Dermed er statisk en ikke-modifikator som brukes i Java og kan brukes på følgende medlemmer:
- Variabler
- Metoder
- Blokker
- Klasser (nærmere bestemt nestede klasser)
Når et medlem blir erklært statisk, kan det nås uten å bruke et objekt. Dette betyr at det statiske medlemmet er aktivt og tilgjengelig før en klasse blir instansert. I motsetning til andre ikke-statiske klassemedlemmer som slutter å eksistere når objektet til klassen går utenfor omfanget, er det statiske medlemmet fortsatt åpenbart aktivt.
Statisk variabel i Java
En medlemsvariabel i en klasse som er erklært som statisk, kalles den statiske variabelen. Det kalles også som 'Klassevariabelen'. Når variabelen er erklært som statisk, tildeles minne bare én gang og ikke hver gang en klasse blir instansert. Derfor kan du få tilgang til den statiske variabelen uten referanse til et objekt.
Følgende Java-program viser bruken av statiske variabler:
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); } }
Produksjon:
I programmet ovenfor har vi to statiske variabler, dvs. a og b. Vi endrer disse variablene i en funksjon “printStatic” så vel som i “main”. Vær oppmerksom på at verdiene til disse statiske variablene er bevart på tvers av funksjonene, selv når omfanget av funksjonen slutter. Utgangen viser verdiene til variabler i to funksjoner.
Hvorfor trenger vi statiske variabler, og hvor er de nyttige?
Statiske variabler er mest nyttige i applikasjoner som trenger tellere. Som du vet, vil tellere gi gale verdier hvis de blir erklært som normale variabler.
For eksempel hvis du har en normal variabel satt som en teller i et program som har en klasse si bil. Så når vi lager et bilobjekt, vil den normale tellervariabelen initialiseres for hver forekomst. Men hvis vi har en motvariabel som en statisk eller klassevariabel, vil den bare initialiseres en gang når klassen er opprettet.
Senere, for hver forekomst av klassen, økes denne telleren av en. Dette er i motsetning til den normale variabelen der telleren for hvert tilfelle økes, men tellerens verdi vil alltid være 1.
Derfor, selv om du lager hundre objekter av klassebilen, vil telleren som en normal variabel alltid ha verdien som 1, mens den med en statisk variabel viser riktig antall på 100.
Nedenfor er et annet eksempel på statiske tellere i Java:
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(); } }
Produksjon:
Virkningen av den statiske variabelen er tydelig i programmet ovenfor. Vi har erklært det statiske variabeltallet med startverdien = 0. Så i konstruktøren av klassen øker vi den statiske variabelen.
I hovedfunksjonen lager vi tre objekter av klassetelleren. Utgangen viser verdien av den statiske variabelen hver gang tellerobjektet opprettes. Vi ser at for hvert objekt som opprettes, blir den eksisterende statiske variabelverdien inkrementert og ikke initialisert på nytt.
Java Static Method
En metode i Java er statisk når den går foran nøkkelordet “statisk”.
Noen punkter du må huske på den statiske metoden inkluderer:
beste anime-nettsteder å se kalt anime
- En statisk metode tilhører klassen i motsetning til andre ikke-statiske metoder som påkalles ved bruk av forekomsten av en klasse.
- For å påkalle en statisk metode trenger du ikke et klasseobjekt.
- Statiske datamedlemmer i klassen er tilgjengelige for den statiske metoden. Den statiske metoden kan til og med endre verdiene til det statiske dataelementet.
- En statisk metode kan ikke ha en referanse til ‘dette’ eller ‘super’ medlemmene. Selv om en statisk metode prøver å henvise dem, vil det være en kompilatorfeil.
- Akkurat som statiske data, kan den statiske metoden også kalle andre statiske metoder.
- En statisk metode kan ikke referere til ikke-statiske datamedlemmer eller variabler og kan ikke kalle ikke-statiske metoder også.
Følgende program viser implementeringen av den statiske metoden i 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(); } }
Produksjon:
Dette er en enkel illustrasjon. Vi definerer en statisk metode som bare skriver ut en melding. Så i hovedfunksjonen kalles den statiske metoden uten noe objekt eller forekomst av en klasse.
Et annet eksempel på statisk nøkkelordimplementering i Java.
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(); } }
I programmet ovenfor, som du kan se, har vi to metoder. Metoden printStatic er en statisk metode mens inst_print er en forekomstmetode. Vi har også to variabler, static_count er en statisk variabel og b er en instansvariabel.
I den statiske metoden - printStatic, viser vi først en melding, og deretter prøver vi å endre verdien på forekomstvariabelen b og også kalle den ikke-statiske metoden.
Deretter prøver vi å bruke 'super' nøkkelordet.
b = 20;
inst_print ();
System.out.println (super.count_static);
Når vi kjører programmet med de ovennevnte linjene, får vi kompileringsfeil for bruk av instansvariabler, kaller ikke-statiske metoder og refererer super i en statisk sammenheng. Dette er begrensningene for den statiske metoden.
Når vi kommenterer de ovennevnte tre linjene, fungerer bare programmet ovenfor og produserer følgende utdata.
Produksjon:
Overbelastning og overstyring av statisk metode
Som dere alle vet, er både overbelastning og overstyring funksjonene i OOPS, og de hjelper til med polymorfisme. Overbelastning kan klassifiseres som polymorfisme med kompileringstid hvor du kan ha metoder med samme navn, men forskjellige parameterlister.
Overstyring er et trekk ved kjøretidspolymorfisme, og i dette blir baseklassemetoden overstyrt i den avledede klassen, slik at metodesignaturen eller prototypen er den samme, men definisjonen er forskjellig.
La oss diskutere hvordan overbelastning og overstyring påvirker den statiske klassen i Java.
Overbelastning
Du kan overbelaste en statisk metode i Java med forskjellige parameterlister, men med samme navn.
Følgende program viser overbelastning:
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!!'); } }
Produksjon:
Dette programmet har to statiske metoder med samme navn ‘statisk_metode’, men en annen argumentliste. Den første metoden tar ikke noe argument, og den andre metoden tar et strengargument.
Et poeng å merke seg er at du ikke kan overbelaste metoden bare avhengig av det 'statiske' nøkkelordet. For eksempel, Hvis du har en instansmetode ‘sum’, og hvis du definerer en annen metode “sum” og erklærer den som statisk, vil den ikke fungere. Dette forsøket på å overbelaste basert på et 'statisk' nøkkelord vil føre til en kompileringsfeil.
Overstyring
Siden statiske metoder påkalles uten noe objekt fra klassen, selv om du har en statisk metode med samme signatur i den avledede klassen, vil den ikke være overordnet. Dette er fordi det ikke er noen polymorfisme i løpetid uten en forekomst.
Derfor kan du ikke overstyre en statisk metode. Men hvis det i det hele tatt er en statisk metode med samme signatur i den avledede klassen, avhenger ikke metoden for å ringe av objektene under kjøretiden, men det avhenger av kompilatoren.
Du må merke deg at selv om statiske metoder ikke kan overstyres, gir Java-språket ingen kompileringsfeil når du har en metode i den avledede klassen med samme signatur som en baseklassemetode.
Følgende implementering viser dette poenget.
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(); } }
Produksjon:
I programmet ovenfor kan du se at den statiske metoden som kalles ikke avhenger av hvilket objekt pekeren peker på. Dette er fordi objekter slett ikke brukes med statiske metoder.
Statisk blokk i Java
Akkurat som du har funksjonsblokker i programmeringsspråk som C ++, C #, etc. også i Java, er det en spesiell blokk kalt “statisk” blokk som vanligvis inkluderer en blokk med kode relatert til statiske data.
Denne statiske blokken utføres i det øyeblikket det første objektet i klassen opprettes (nøyaktig på tidspunktet for klasselasting) eller når det statiske elementet inne i blokken brukes.
Følgende program viser bruken av en statisk blokk.
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); } }
Produksjon:
Legg merke til rekkefølgen for gjennomføring av uttalelser i programmet ovenfor. Innholdet i den statiske blokken utføres først etterfulgt av hovedprogrammet. De statiske variablene sum og val1 har innledende verdier mens val2 ikke initialiseres (den er som standard 0). Så i den statiske blokken er val2 fortsatt ikke tildelt en verdi, og derfor vises verdien som 0.
c ++ dobbeltkoblet listeeksempel
Variabelen val2 tildeles verdi etter utskrift i den statiske blokken og summen beregnes på nytt. Derfor, i hovedfunksjonen, får vi forskjellige verdier av sum og val2.
Hvis du spesifiserer en konstruktør, blir innholdet i den statiske blokken utført allerede før konstruktøren. De statiske blokkene brukes mest til å initialisere statiske medlemmer av klassen og annen initialisering relatert til statiske medlemmer.
Java Statisk klasse
I Java har du statiske blokker, statiske metoder og til og med statiske variabler. Derfor er det åpenbart at du også kan ha statiske klasser. I Java er det mulig å ha en klasse i en annen klasse, og dette kalles en nestet klasse. Klassen som omslutter den nestede klassen kalles Ytre klasse.
I Java, selv om du kan erklære en nestet klasse som statisk, er det ikke mulig å ha den ytre klassen som statisk.
La oss nå utforske de statiske nestede klassene i Java.
Statisk nestet klasse i Java
Som allerede nevnt, kan du få en nestet klasse i Java erklært som statisk. Den statisk nestede klassen skiller seg fra den ikke-statiske nestede klassen (indre klasse) i visse aspekter som listet opp nedenfor.
I motsetning til den ikke-statiske nestede klassen, trenger den nestede statiske klassen ikke en ytre klassereferanse.
En statisk nestet klasse kan bare få tilgang til statiske medlemmer av den ytre klassen mot de ikke-statiske klassene som har tilgang til statiske så vel som ikke-statiske medlemmer av den ytre klassen.
Et eksempel på en statisk nestet klasse er gitt nedenfor.
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(); } }
Produksjon:
I programmet ovenfor ser du at den statiske nestede klassen kan få tilgang til den statiske variabelen (streng) fra den ytre klassen.
Statisk import i Java
Som du vet inkluderer vi vanligvis forskjellige pakker og forhåndsdefinert funksjonalitet i Java-programmet ved å bruke 'import' -direktivet. Ved å bruke ordet statisk med importdirektivet kan du bruke klassefunksjonaliteten uten å bruke klassenavnet.
Eksempel:
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'); } }
Produksjon:
c ++ binært treeksempel
I dette programmet bruker vi statisk import for klassen java.lang.System.
Merk: I hovedfunksjonen har vi nettopp brukt out.println til å vise meldingen.
Selv om den statiske importfunksjonen gjør koden mer kortfattet og lesbar, skaper den noen ganger uklarhet, spesielt når noen pakker har de samme funksjonene. Derfor bør statisk import bare brukes når det er ekstremt nødvendig.
Statisk vs ikke-statisk
La oss diskutere de store forskjellene mellom statiske og ikke-statiske medlemmer av Java.
Nedenfor er forskjellene mellom Statiske og ikke-statiske variabler .
Statiske variabler | Ikke-statiske variabler |
---|---|
Den er kun tilgjengelig ved å bruke klassenavn. | Krever gjenstander fra en klasse for å få tilgang. |
Er tilgjengelig for både statiske og ikke-statiske metoder. | Er bare tilgjengelig for ikke-statiske metoder. |
Et minne for statisk variabel tildeles bare en gang per klasse. | Et minne for ikke-statiske variabler tildeles per objekt. |
Delt av alle objektene i klassen. | Det lages en kopi av variabelen per objekt. |
Har globalt omfang og er tilgjengelig for alle metoder og blokker. | Har lokalt omfang og er synlig for gjenstander i klassen. |
Nedenfor er forskjellen mellom statiske og ikke-statiske metoder .
Statiske metoder | Ikke-statiske metoder |
---|---|
En metode som går foran et statisk nøkkelord og er tilgjengelig på klassenivå. | En metode som ikke foregår med statiske nøkkelord og er tilgjengelig for hver av forekomster av klassen. |
Støtter kompileringstid eller tidlig binding. | Støtter kjøretid eller dynamisk binding. |
Har bare tilgang til medlemmer av statiske data i klassen og andre klasser. | Har tilgang til statiske så vel som ikke-statiske medlemmer av klassen og andre klasser. |
Statiske metoder kan ikke overstyres. | Kan overstyres. |
Minne tildeles bare en gang. Derfor er minnet brukt mindre. | Minneforbruk er mer siden minne tildeles hver gang metoden påkalles. |
Statisk vs finale
Statisk og endelig er to nøkkelord i Java som kan gi spesiell betydning for enheten som den brukes sammen med. For eksempel, når en variabel blir deklarert som statisk, blir den en klassevariabel som er tilgjengelig uten referanse til objektet.
Tilsvarende, når en variabel blir erklært som endelig, blir den uforanderlig, dvs. en konstant.
La oss tabellisere noen av de største forskjellene mellom statiske og endelige søkeord i Java.
Statisk | Endelig |
---|---|
Et statisk data-medlem (nestet klasse, variabel eller metode) er et data-medlem som er innledet av et statisk nøkkelord og kan nås uten et objekt. | Det siste nøkkelordet kan brukes på en variabel, metode, klasse osv. og pålegger enhetene begrensninger. |
Ikke obligatorisk å initialisere den statiske variabelen med verdien under erklæringen. | Det kreves at den endelige variabelen initialiseres til en verdi på erklæringstidspunktet |
Du kan initialisere de statiske variablene på nytt. | Ikke mulig å initialisere de endelige variablene på nytt. |
Statiske metoder er de som bare har tilgang til statiske medlemmer. | Endelige metoder er metodene som ikke kan arves / overstyres. |
Statiske klasser er klasser hvis objekter ikke kan opprettes. | Avsluttende klasser er klasser som ikke kan arves. |
ofte stilte spørsmål
Q # 1) Kan Java-klasse være statisk?
Svar: Ja, en klasse i Java kan være statisk, forutsatt at den ikke er den ytre klassen. Dette betyr at bare nestede klasser i Java kan være statiske.
Q # 2) Når skal jeg bruke Static i Java?
Svar: Når du vil ha et datamedlem i programmet ditt som skal beholde verdien over objektene, bør du bruke statisk. For eksempel, en teller. En metode kan erklæres som statisk når du ikke vil påberope den ved hjelp av et objekt.
Q # 3) Kan en statisk klasse ha en konstruktør?
Svar: Ja, en statisk klasse kan ha en konstruktør, og formålet er utelukkende å initialisere medlemmer av statiske data. Det vil bare påberopes for første gang når datamedlemmene er tilgjengelige. Det blir ikke påkalt for påfølgende tilgang.
Q # 4) Hva er bruken av Static Constructor?
Svar: Generelt brukes konstruktøren til å initialisere statiske data-medlemmer. Den brukes også til å utføre operasjoner / handlinger som bare må utføres en gang.
Q # 5) Er statiske metoder arvet i Java?
Svar: Ja, statiske metoder i Java arves, men overstyres ikke.
Konklusjon
I denne opplæringen diskuterte vi det statiske nøkkelordet til Java i detalj sammen med dets bruk i datamedlemmer, metoder, blokker og klasser. Det statiske nøkkelordet er et nøkkelord som brukes til å indikere klassenivå eller globalt omfang.
Du trenger ikke få tilgang til statiske medlemmer ved bruk av forekomster av klassen. Du kan få direkte tilgang til de statiske datamedlemmene ved hjelp av kursnavnet. Vi diskuterte også de store forskjellene mellom statiske og ikke-statiske medlemmer, så vel som statiske og endelige nøkkelord.
I de påfølgende emnene vil vi utforske flere nøkkelord og deres betydning på Java-språk.
Anbefalt lesing
- Statisk i C ++
- Java-grensesnitt og abstrakt klasseopplæring med eksempler
- Java-distribusjon: Opprettelse og utføring av Java JAR-fil
- Java Virtual Machine: Hvordan JVM hjelper med å kjøre Java-applikasjoner
- C # -konsepter: Constructor, Destructor, Static Class, Struct & Enum
- Få tilgang til modifikatorer i Java - opplæring med eksempler
- Java Reflection Tutorial med eksempler
- Introduksjon til Java Programming Language - Video Tutorial