what is static keyword java
Denne vejledning forklarer statiske nøgleord i Java og dets anvendelse i variabler, metoder, blokke og klasser. Angiver også forskellen mellem statiske og ikke-statiske medlemmer:
Java understøtter forskellige typer erklæringer for at angive omfanget og opførslen af dens variabler, metoder, klasser osv. For eksempel, nøgleordet endelig, forseglet, statisk osv. Alle disse erklæringer har en eller anden specifik betydning, når de bruges i Java-programmet.
Vi vil undersøge alle disse nøgleord, når vi fortsætter med denne vejledning. Her vil vi diskutere detaljerne i et af de vigtigste nøgleord i Java, dvs. 'statisk'.
Hvad du lærer:
- Statisk nøgleord i Java
- Konklusion
Statisk nøgleord i Java
Et medlem i et Java-program kan erklæres statisk ved hjælp af nøgleordet 'statisk' forud for dets erklæring / definition. Når et medlem erklæres statisk, betyder det i det væsentlige, at medlemmet deles af alle forekomster af en klasse uden at lave kopier af pr. Forekomst.
Således er statisk en ikke-klassificeringsmodifikator, der bruges i Java og kan anvendes på følgende medlemmer:
- Variabler
- Metoder
- Blokke
- Klasser (mere specifikt indlejrede klasser)
Når et medlem erklæres statisk, kan det tilgås uden brug af et objekt. Dette betyder, at det statiske medlem er aktivt og tilgængeligt, før en klasse instanseres. I modsætning til andre ikke-statiske klassemedlemmer, der ophører med at eksistere, når klassens genstand går ud af omfanget, er det statiske medlem stadig åbenlyst aktivt.
Statisk variabel i Java
En medlemsvariabel i en klasse, der er erklæret statisk, kaldes den statiske variabel. Det kaldes også som 'Klassevariablen'. Når variablen er deklareret som statisk, tildeles hukommelsen kun én gang og ikke hver gang en klasse instantieres. Derfor kan du få adgang til den statiske variabel uden en henvisning til et objekt.
Følgende Java-program viser brugen af 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); } }
Produktion:
I ovenstående program har vi to statiske variabler, dvs. a og b. Vi ændrer disse variabler i en funktion “printStatic” såvel som i “main”. Bemærk, at værdierne for disse statiske variabler bevares på tværs af funktionerne, selv når funktionsomfanget slutter. Outputtet viser værdierne af variabler i to funktioner.
Hvorfor har vi brug for statiske variabler, og hvor er de nyttige?
Statiske variabler er mest nyttige i applikationer, der har brug for tællere. Som du ved, vil tællere give forkerte værdier, hvis de erklæres som normale variabler.
For eksempel, hvis du har en normal variabel indstillet som en tæller i et program, der har en klasse siger bil. Så når vi opretter et bilobjekt, initialiseres den normale tællervariabel med hver forekomst. Men hvis vi har en modvariabel som en statisk eller klassevariabel, initialiseres den kun en gang, når klassen oprettes.
Senere, for hver forekomst af klassen, forøges denne tæller af en. Dette er i modsætning til den normale variabel, hvor tælleren med hver forekomst vil blive forøget, men tællerens værdi vil altid være 1.
Derfor, selvom du opretter hundrede objekter af klassebilen, vil tælleren som en normal variabel altid have værdien 1, mens den med en statisk variabel viser det korrekte antal på 100.
Nedenfor er et andet eksempel på statiske tællere 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(); } }
Produktion:
Funktionen af den statiske variabel fremgår af ovenstående program. Vi har erklæret det statiske variabeltal med den indledende værdi = 0. Så i konstruktøren af klassen øger vi den statiske variabel.
I hovedfunktionen opretter vi tre objekter af klassetælleren. Outputtet viser værdien af den statiske variabel hver gang, når tællerobjektet oprettes. Vi ser, at den eksisterende statiske variabelværdi for hvert objekt, der oprettes, øges og ikke geninitialiseres.
Statisk Java-metode
En metode i Java er statisk, når den er forud for nøgleordet 'statisk'.
Nogle punkter, du skal huske på den statiske metode, inkluderer:
bedste gratis python ide til windows
- En statisk metode hører til klassen i modsætning til andre ikke-statiske metoder, der påberåbes ved hjælp af forekomsten af en klasse.
- For at påberåbe sig en statisk metode har du ikke brug for et klasseobjekt.
- Klasserne for statiske data i klassen er tilgængelige for den statiske metode. Den statiske metode kan endda ændre værdierne for det statiske data-medlem.
- En statisk metode kan ikke have en henvisning til 'dette' eller 'super' medlemmer. Selvom en statisk metode forsøger at henvise dem, vil det være en kompilatorfejl.
- Ligesom statiske data kan den statiske metode også kalde andre statiske metoder.
- En statisk metode kan ikke henvise til ikke-statiske datamedlemmer eller variabler og kan heller ikke kalde ikke-statiske metoder.
Følgende program viser implementeringen af den statiske metode 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(); } }
Produktion:
Dette er en simpel illustration. Vi definerer en statisk metode, der blot udskriver en besked. Derefter kaldes den statiske metode i hovedfunktionen uden noget objekt eller en forekomst af en klasse.
Et andet eksempel på statisk søgeordsimplementering 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 ovenstående program har vi, som du kan se, to metoder. Metoden printStatic er en statisk metode, mens inst_print er en instansmetode. Vi har også to variabler, static_count er en statisk variabel og b er en instansvariabel.
I den statiske metode - printStatic viser vi først en meddelelse, og derefter prøver vi at ændre værdien af instansvariablen b og også kalde den ikke-statiske metode.
Dernæst forsøger vi at bruge 'super' nøgleordet.
b = 20;
inst_print ();
System.out.println (super.count_static);
Når vi udfører programmet med ovenstående linjer, får vi kompileringsfejl til brug af instansvariabler, kalder ikke-statiske metoder og henviser super i en statisk sammenhæng. Dette er begrænsningerne ved den statiske metode.
Når vi kommenterer de ovennævnte tre linjer, fungerer først ovenstående program fint og producerer følgende output.
Produktion:
Overbelastning og tilsidesættelse af statisk metode
Som du alle ved, er både overbelastning og overstyring funktionerne i OOPS, og de hjælper med polymorfisme. Overbelastning kan klassificeres som kompileringstidspolymorfisme, hvor du kan have metoder med samme navn, men forskellige parameterlister.
Overstyring er et træk ved polymorfisme i løbetid, og i dette tilsidesættes baseklassemetoden i den afledte klasse, så metodesignaturen eller prototypen er den samme, men definitionen er forskellig.
Lad os diskutere, hvordan overbelastning og overstyring påvirker den statiske klasse i Java.
Overbelastning
Du kan overbelaste en statisk metode i Java med forskellige 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!!'); } }
Produktion:
Dette program har to statiske metoder med samme navn 'statisk_metode', men en anden argumenteliste. Den første metode tager ikke noget argument, og den anden metode tager et strengargument.
Et punkt at bemærke er, at du ikke kan overbelaste metoden kun afhængigt af det 'statiske' nøgleord. For eksempel, Hvis du har en instansmetode 'sum', og hvis du definerer en anden metode 'sum' og erklærer den som statisk, så fungerer den ikke. Dette forsøg på at overbelaste baseret på et 'statisk' nøgleord vil resultere i en kompileringsfejl.
Tilsidesættelse
Da statiske metoder påberåbes uden noget objekt i klassen, selvom du har en statisk metode med den samme signatur i den afledte klasse, overgår den ikke. Dette er fordi der ikke er nogen run-time polymorfisme uden en instans.
Derfor kan du ikke tilsidesætte en statisk metode. Men hvis der overhovedet er en statisk metode med den samme signatur i den afledte klasse, så afhænger metoden til opkald ikke af objekterne under kørselstid, men det afhænger af compileren.
Du skal bemærke, at selvom statiske metoder ikke kan tilsidesættes, giver Java-sproget ingen compiler-fejl, når du har en metode i den afledte klasse med samme signatur som en baseklassemetode.
Den følgende implementering beviser dette punkt.
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(); } }
Produktion:
I ovenstående program kan du se, at den statiske metode, der kaldes, ikke afhænger af hvilket objekt markøren peger på. Dette skyldes, at objekter slet ikke bruges med statiske metoder.
hvordan man åbner torrentfiler windows 10
Statisk blokering i Java
Ligesom du også har funktionsblokke i programmeringssprog som C ++, C # osv. I Java, er der en speciel blok kaldet “statisk” blok, der normalt inkluderer en blok med kode relateret til statiske data.
Denne statiske blok udføres i det øjeblik, hvor det første objekt i klassen oprettes (præcist på klassetidspunktet), eller når det statiske element inde i blokken bruges.
Det følgende program viser brugen af en statisk blok.
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); } }
Produktion:
Bemærk rækkefølgen for udførelse af erklæringer i ovenstående program. Indholdet af den statiske blok udføres først efterfulgt af hovedprogrammet. De statiske variabler sum og val1 har indledende værdier, mens val2 ikke initialiseres (det er som standard 0). Derefter tildeles val2 stadig ikke en værdi i den statiske blok, og derfor vises dens værdi som 0.
Variablen val2 tildeles værdi efter udskrivning i den statiske blok, og summen genberegnes. Derfor får vi i hovedfunktionen forskellige værdier af sum og val2.
Hvis du angiver en konstruktør, udføres indholdet af den statiske blok endnu inden konstruktøren. De statiske blokke bruges mest til at initialisere statiske medlemmer af klassen og anden initialisering relateret til statiske medlemmer.
Java Statisk klasse
I Java har du statiske blokke, statiske metoder og endda statiske variabler. Derfor er det indlysende, at du også kan have statiske klasser. I Java er det muligt at have en klasse inde i en anden klasse, og dette kaldes en nestet klasse. Klassen, der omslutter den indlejrede klasse, kaldes den ydre klasse.
I Java, selvom du kan erklære en indlejret klasse som statisk, er det ikke muligt at have den ydre klasse som statisk.
Lad os nu udforske de statiske indlejrede klasser i Java.
Statisk indlejret klasse i Java
Som allerede nævnt kan du få en indlejret klasse i Java erklæret som statisk. Den statisk indlejrede klasse adskiller sig fra den ikke-statiske indlejrede klasse (indre klasse) i visse aspekter som angivet nedenfor.
I modsætning til den ikke-statiske indlejrede klasse har den indlejrede statiske klasse ikke brug for en ydre klassereference.
En statisk indlejret klasse kan kun få adgang til statiske medlemmer af den ydre klasse i forhold til de ikke-statiske klasser, der kan få adgang til statiske såvel som ikke-statiske medlemmer af den ydre klasse.
Et eksempel på en statisk indlejret klasse er angivet nedenfor.
gratis firewallbeskyttelse til Windows 10
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(); } }
Produktion:
I ovenstående program ser du, at den statiske indlejrede klasse kan få adgang til den statiske variabel (streng) fra den ydre klasse.
Statisk import i Java
Som du ved, inkluderer vi normalt forskellige pakker og foruddefineret funktionalitet i Java-programmet ved hjælp af 'import' -direktivet. Brug af ordet statisk med importdirektivet giver dig mulighed for at bruge klassefunktionaliteten uden at bruge klassens navn.
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'); } }
Produktion:
I dette program bruger vi statisk import til klassen java.lang.System.
Bemærk: I hovedfunktionen har vi lige brugt out.println til at vise meddelelsen.
Selvom den statiske importfunktion gør koden mere kortfattet og læsbar, skaber den undertiden tvetydighed, især når nogle pakker har de samme funktioner. Derfor bør statisk import kun bruges, når det er meget nødvendigt.
Statisk vs Ikke-statisk
Lad os diskutere de store forskelle mellem statiske og ikke-statiske medlemmer af Java.
Nedenfor er forskellene mellem Statiske og ikke-statiske variabler .
Statiske variabler | Ikke-statiske variabler |
---|---|
Det kan kun tilgås ved hjælp af klasse navn. | Kræver objekter fra en klasse for at få adgang. |
Er tilgængelige for både statiske såvel som ikke-statiske metoder. | Er kun tilgængelige for ikke-statiske metoder. |
En hukommelse til statisk variabel tildeles kun en gang pr. Klasse. | En hukommelse til ikke-statiske variabler tildeles pr. Objekt. |
Delt af alle klassens genstande. | Der laves en kopi af variablen pr. Objekt. |
Har globalt omfang og er tilgængelig for alle metoder og blokke. | Har lokalt omfang og er synlig for objekter i klassen. |
Nedenfor er forskellen mellem statiske og ikke-statiske metoder .
Statiske metoder | Ikke-statiske metoder |
---|---|
En metode, der er forud for et statisk nøgleord, og som er tilgængelig på klasseniveau. | En metode, der ikke er forud for et statisk nøgleord, og som er tilgængelig for hver af forekomsterne i klassen. |
Understøtter kompileringstid eller tidlig binding. | Understøtter runtime eller dynamisk binding. |
Kan kun få adgang til statiske data medlemmer af sin klasse og enhver anden klasse. | Kan få adgang til statiske såvel som ikke-statiske medlemmer af klassen og andre klasser. |
Statiske metoder kan ikke tilsidesættes. | Kan tilsidesættes. |
Hukommelse tildeles kun en gang. Derfor er den anvendte hukommelse mindre. | Hukommelsesforbruget er mere, da hukommelsen tildeles hver gang metoden påberåbes. |
Statisk vs Final
Statisk og endelig er to nøgleord i Java, der kan give den enhed, den bruges sammen med, særlig betydning. For eksempel, når en variabel erklæres som statisk, bliver den til en klassevariabel, der kan tilgås uden en henvisning til objektet.
Tilsvarende, når en variabel erklæres som endelig, bliver den uforanderlig, dvs. en konstant.
Lad os tabulere nogle af de største forskelle mellem statiske og endelige nøgleord i Java.
Statisk | Endelig |
---|---|
Et statisk data-medlem (indlejret klasse, variabel eller metode) er et data-medlem forud for et statisk nøgleord og kan tilgås uden et objekt. | Det endelige nøgleord kan anvendes på en variabel, metode, klasse osv. og pålægger enhederne begrænsninger. |
Ikke obligatorisk at initialisere den statiske variabel med værdien under erklæringen. | Det kræves, at den endelige variabel initialiseres til en værdi på erklæringstidspunktet |
Du kan geninitialisere de statiske variabler. | Det er ikke muligt at geninitialisere de endelige variabler. |
Statiske metoder er dem, der kun har adgang til statiske medlemmer. | Endelige metoder er de metoder, der ikke kan nedarves / tilsidesættes. |
Statiske klasser er klasser, hvis objekter ikke kan oprettes. | Afsluttende klasser er klasser, der ikke kan arves. |
Ofte stillede spørgsmål
Q # 1) Kan Java-klasse være statisk?
Svar: Ja, en klasse i Java kan være statisk, forudsat at den ikke er den ydre klasse. Dette betyder, at kun indlejrede klasser i Java kan være statiske.
Q # 2) Hvornår skal jeg bruge Static i Java?
Svar: Når du vil have et datamedlem i dit program, der skal holde dets værdi på tværs af objekterne, skal du bruge statisk. For eksempel, en tæller. En metode kan erklæres som statisk, når du ikke ønsker at påberåbe den ved hjælp af et objekt.
Q # 3) Kan en statisk klasse have en konstruktør?
Svar: Ja, en statisk klasse kan have en konstruktør, og dens formål er udelukkende at initialisere medlemmer af statiske data. Det påberåbes kun for første gang, når der er adgang til datamedlemmerne. Det påberåbes ikke for efterfølgende adgang.
Q # 4) Hvad er brugen af Static Constructor?
Svar: Generelt bruges konstruktøren til at initialisere statiske data-medlemmer. Det bruges også til at udføre operationer / handlinger, der kun skal udføres en gang.
Q # 5) Er statiske metoder nedarvet i Java?
Svar: Ja, statiske metoder i Java nedarves, men overstyres ikke.
Konklusion
I denne vejledning diskuterede vi det statiske nøgleord i Java detaljeret sammen med dets anvendelse i datamedlemmer, metoder, blokke og klasser. Det statiske nøgleord er et nøgleord, der bruges til at angive klasseniveau eller globalt omfang.
Du har ikke brug for at få adgang til statiske medlemmer ved hjælp af forekomster af klassen. Du kan få direkte adgang til de statiske datamedlemmer ved hjælp af klassens navn. Vi diskuterede også de store forskelle mellem statiske og ikke-statiske medlemmer samt statiske og endelige nøgleord.
I vores efterfølgende emner vil vi undersøge flere nøgleord og deres betydning på Java-sprog.
Anbefalet læsning
- Statisk i C ++
- Java-interface og abstrakt klasseundervisning med eksempler
- Java-implementering: Oprettelse og udførelse af Java JAR-fil
- Java Virtual Machine: Hvordan JVM hjælper med at køre Java-applikationer
- C # -koncepter: Konstruktør, Destructor, Statisk klasse, Struct & Enum
- Adgang modifikatorer i Java - vejledning med eksempler
- Java Reflection Tutorial med eksempler
- Introduktion til Java-programmeringssprog - Videovejledning