Ik ben altijd in de war tussen static
en final
zoekwoorden in java.
Hoe verschillen ze?
Antwoord 1, autoriteit 100%
Het statische trefwoord kan in 4 scenario’s worden gebruikt
- statische variabelen
- statische methoden
- statische codeblokken
- statische geneste klasse
Laten we eerst kijken naar statische variabelen en statische methoden.
Statische variabele
- Het is een variabele die bij de klasse hoort en niet bij het object (instantie).
- Statische variabelen worden slechts één keer geïnitialiseerd, aan het begin van de uitvoering. Deze variabelen worden eerst geïnitialiseerd, voordat eventuele instantievariabelen worden geïnitialiseerd.
- Een enkele kopie die door alle instanties van de klasse moet worden gedeeld.
- Een statische variabele is direct toegankelijk via de klassenaam en heeft geen object nodig.
- Syntaxis:
Class.variable
Statische methode
- Het is een methode die bij de klasse hoort en niet bij het object (instantie).
- Een statische methode heeft alleen toegang tot statische gegevens. Het heeft geen toegang tot niet-statische gegevens (instantievariabelen) tenzij het een instantie van de klasse heeft/maakt.
- Een statische methode kan alleen andere statische methoden aanroepen en kan er geen niet-statische methode van aanroepen, tenzij deze een instantie van de klasse heeft/maakt.
- Een statische methode is direct toegankelijk via de klassenaam en heeft geen object nodig.
- Syntaxis:
Class.methodName()
- Een statische methode kan hoe dan ook niet verwijzen naar
this
ofsuper
zoekwoorden.
Statische klasse
Java heeft ook “statische geneste klassen”. Een statische geneste klasse is slechts een klasse die niet impliciet een verwijzing heeft naar een instantie van de buitenste klasse.
Statische geneste klassen kunnen instantiemethoden en statische methoden hebben.
Er bestaat niet zoiets als een statische klasse op het hoogste niveau in Java.
Side Opmerking:
Hoofdmethode is
static
Aangezien het toegankelijk moet zijn voor een toepassing die wordt uitgevoerd voordat een instantie plaatsvindt.
final
Trefwoord wordt gebruikt in verschillende contexten om een entiteit te definiëren die niet later kan worden gewijzigd.
-
A
final
Klasse kan niet worden gesuclimeerd. Dit gebeurt om redenen van veiligheid en efficiëntie. Dienovereenkomstig zijn veel van de Java-standaardbibliotheekklassenfinal
, bijvoorbeeldjava.lang.System
enjava.lang.String
. Alle methoden in eenfinal
klasse zijn implicietfinal
. -
A
final
Methode kan niet worden overschreven door subklassen. Dit wordt gebruikt om onverwacht gedrag te voorkomen van een subklasse die een methode verandert die mogelijk cruciaal is voor de functie of consistentie van de klasse. -
A
final
Variabele kan slechts één keer worden geïnitialiseerd via een initializer of een opdrachtverklaring. Het hoeft niet op het punt van aangifte te worden geïnitialiseerd: dit wordt eenblank final
variabele genoemd. Een blanco definitieve instantie-variabele van een klasse moet absoluut worden toegewezen aan het einde van elke constructeur van de klasse waarin deze wordt verklaard; Evenzo moet een lege definitieve statische variabele definitief worden toegewezen in een statische initializer van de klasse waarin deze wordt verklaard; Anders treedt er in beide gevallen een compiler-time-fout op.
OPMERKING: als de variabele een referentie is, betekent dit dat de variabele niet opnieuw wordt gebonden om een ander object te verwijzen. Maar het object dat IT-referenties nog steeds veranderbaar is, als het oorspronkelijk was.
Als een anonieme binnenklasse is gedefinieerd binnen de hoofdtekst van een methode, zijn alle variabelen die in het kader van die methode als final
zijn gedeclareerd, toegankelijk vanuit de binnenklasse. Als deze eenmaal is toegewezen, kan de waarde van de laatste variabele niet meer veranderen.
Antwoord 2, autoriteit 16%
statischbetekent dat het tot de klasse behoort en niet tot een instantie, dit betekent dat er slechts één kopie van die variabele/methode wordt gedeeld tussen alle instanties van een bepaalde Klasse.
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
finalis helemaal niet gerelateerd, het is een manier om een eenmalige initialisatie te definiëren. U kunt ofwel initialiseren bij het definiëren van de variabele of binnen de constructor, nergens anders.
opmerkingEen opmerking over definitieve methoden en eindklassen, dit is een manier om expliciet aan te geven dat de methode of klasse niet respectievelijk kan worden overschreven / uitgebreid.
Extra lezen
Dus over het onderwerp statisch, we hadden het over de andere toepassingen die het kan hebben, het wordt soms gebruikt in statische blokken. Bij het gebruik van statische variabelen is het soms nodig om deze variabelen in te stellen voordat je de klasse gebruikt, maar helaas krijg je geen constructor. Dit is waar het statische zoekwoord om de hoek komt kijken.
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
Je moet dit niet verwarren met instantie-initialisatieblokken die vóór de constructor perinstantie worden aangeroepen.
Antwoord 3, autoriteit 10%
De twee lijken niet echt op elkaar. static
velden zijn velden die niet tot een bepaalde instantie van een klasse behoren.
class C {
public static int n = 42;
}
Hier is het static
veld n
niet gekoppeld aan een bepaalde instantie van C
maar aan de hele klasse in het algemeen (wat waarom C.n
kan worden gebruikt om toegang te krijgen). Kun je nog steeds een instantie van C
gebruiken om toegang te krijgen tot n
? Ja, maar het wordt niet als bijzonder goed beschouwd.
final
daarentegen geeft aan dat een bepaalde variabele niet kan veranderen nadat deze is geïnitialiseerd.
class C {
public final int n = 42;
}
Hier kan n
niet opnieuw worden toegewezen omdat het final
is. Een ander verschil is dat elke variabele final
kan worden verklaard, terwijl niet elke variabele statisch kan worden verklaard.
Klassen kunnen ook als final
worden verklaard, wat aangeeft dat ze niet kunnen worden verlengd:
final class C {}
class B extends C {} // error!
Op dezelfde manier kunnen methoden definitief worden verklaard om aan te geven dat ze niet kunnen worden overschrevendoor een uitbreidende klasse:
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
Antwoord 4, autoriteit 9%
static
betekent dat er slechts één kopie van de variabele in het geheugen is die door alle instanties van de klasse wordt gedeeld.
Het trefwoord final
betekent alleen dat de waarde niet kan worden gewijzigd. Zonder final
kan elk object de waarde van de variabele wijzigen.
Antwoord 5, autoriteit 9%
finale –
1)Als we het zoekwoord ‘final‘ toepassen op een variabele, blijft de waarde van die variabele constant.
(of)
Zodra we een variabeleals definitiefdeclareren, kan de waarde van die variabele niet meer worden gewijzigd.
2)Het is handig wanneer een waarde van een variabeleniet verandert tijdens de levensduur van een programma
statisch –
1)wanneer we het trefwoord ‘statisch‘ toepassen op een variabele, betekent dit dat het tot een klasse behoort.
2)Wanneer we het trefwoord “statisch” toepassen op een methode, betekent dit dat de methodetoegankelijk is zonder een instantie van de klasse te maken
Antwoord 6, autoriteit 2%
Denk aan een object als een luidspreker. Als Luidspreker een klasse is, heeft deze verschillende variabelen zoals volume, hoge tonen, lage tonen, kleur enz. U definieert al deze velden terwijl u de klasse Luidspreker definieert. U hebt bijvoorbeeld het kleurveld gedeclareerd met een statische modifier, wat betekent dat u de compiler vertelt dat er precies één kopie van deze variabele bestaat, ongeacht hoe vaak de klasse is geïnstantieerd.
Verklaren
static final String color = "Black";
zorgt ervoor dat wanneer deze klasse wordt geïnstantieerd, de waarde van het kleurveld “Zwart” is, tenzij deze niet wordt gewijzigd.
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
Opmerking: als u nu de kleur van de luidspreker als definitief wijzigt, wordt deze code niet uitgevoerd, omdat het laatste trefwoord ervoor zorgt dat de waarde van het veld nooit verandert.
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
Je kunt deze code rechtstreeks in je emulator kopiëren/plakken en het proberen.
Antwoord 7
Statisch en definitief hebben enkele grote verschillen:
Statische variabelen of klassen zijn altijd (vrijwel) overal beschikbaar. Final is slechts een trefwoord dat betekent dat een variabele niet kan worden gewijzigd. Dus als had:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
Het programma zou draaien totdat het probeerde het ‘eerste’ integer te veranderen, dat een fout zou veroorzaken. Buiten deze klasse zou je alleen toegang hebben tot de “eerste” -variabele als je de klas had geïnstantieerd. Dit staat in contrast met “tweede”, die de hele tijd beschikbaar is.
Antwoord 8
eenvoudig verschil,
Finale : betekent dat de waarde van de variabele definitief is en het zal overal niet veranderen. Als u die laatste x = 5 zegt, betekent dat X niet kan worden gewijzigd. De waarde is definitief voor iedereen.
statisch : betekent dat het slechts één object heeft. Laten we veronderstellen dat je x = 5 hebt, in het geheugen is er x = 5 en het is aanwezig in een klasse. Als u een object of exemplaar van de klasse maakt, wat daarvoor een specifieke doos betekent die deze klasse en variabelen en methoden vertegenwoordigt. En als u een ander object of exemplaar van die klasse maakt, betekent dit dat er twee dozen van diezelfde klasse zijn die anders dan X in het geheugen heeft. En als u zowel X in verschillende posities belt en hun waarde wilt wijzigen, is hun waarde anders. Box 1 heeft X die X = 5 en Box 2 heeft, X = 6. Maar als u de X-statisch maakt, betekent dit dat het niet opnieuw kan worden gemaakt.
U kunt object van de les maken, maar dat object zal niet anders dan X in hen hebben.
Als X statisch is, dan hebben BOX 1 en BOX 2 beide dezelfde X die de waarde heeft van 5. Ja, ik kan de waarde van statische wijziging wijzigen waar het niet definitief is. Dus als ik zeg 1 heeft x en ik verander de waarde van x = 5 en daarna maak ik nog een doos die box2 is en ik de waarde van box2 x tot x = 6 verander. Dan is AS X Statisch zijn beide dozen dezelfde x. en beide dozen geven de waarde van het vakje als 6 omdat Box2 de waarde van 5 tot 6 overschrijft.
Beide finale en statisch zijn totaal anders. Finale die definitief is, kan niet worden gewijzigd. statisch die als één zal blijven, maar kan worden veranderd.
“Dit is een voorbeeld. onthoud dat statische variabelen altijd bij hun klassenaam worden genoemd. omdat ze slechts één zijn voor alle objecten van die klasse. dus
Klasse A heeft x = 5, ik kan het aanroepen en wijzigen door A.x = 6; “
Antwoord 9
Statisch is iets dat elk object in een klasse kan aanroepen, dat inherent tot een objecttype behoort.
Een variabele kan definitief zijn voor een hele klas, en dat betekent simpelweg dat hij niet meer kan worden gewijzigd. Het kan maar één keer worden ingesteld en als u het opnieuw probeert in te stellen, wordt er een fout gegenereerd. Het is om een aantal redenen nuttig, misschien wilt u een constante declareren die niet kan worden gewijzigd.
Enkele voorbeeldcode:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Wikipedia bevat de volledige lijst met java-trefwoorden.
Antwoord 10
Ik zal hier niet proberen een volledig antwoord te geven. Mijn aanbeveling zou zijn om je te concentreren op het begrijpen van wat elk van hen doet en dan zou het duidelijk moeten zijn om te zien dat hun effecten totaal verschillend zijn en waarom ze soms samen worden gebruikt.
static
is voor leden van een klasse (attributen en methoden) en moet worden begrepen in tegenstelling tot bijvoorbeeld (niet-statische) leden. Ik raad aan om “Instance and Class Members”te lezen in De Java-tutorials. Ik kan ook worden gebruikt in static
blokken, maar ik zou me er om te beginnen geen zorgen over maken.
final
heeft verschillende betekenissen, afhankelijk van of het wordt toegepast op variabelen, methoden, klassen of andere gevallen. Hier vind ik Wikipedia-uitlegbeter.
Antwoord 11
Statische variabelewaarden kunnen worden gewijzigd, hoewel één kopie van de variabele door de applicatie gaat, terwijl Final Variable-waarden één keer kunnen worden geïnitialiseerd en niet in de hele applicatie kunnen worden gewijzigd.