Verschil tussen statisch en definitief?

Ik ben altijd in de war tussen staticen finalzoekwoorden 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 thisof superzoekwoorden.

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 staticAangezien het toegankelijk moet zijn voor een toepassing die wordt uitgevoerd voordat een instantie plaatsvindt.

finalTrefwoord wordt gebruikt in verschillende contexten om een ​​entiteit te definiëren die niet later kan worden gewijzigd.

  • A finalKlasse kan niet worden gesuclimeerd. Dit gebeurt om redenen van veiligheid en efficiëntie. Dienovereenkomstig zijn veel van de Java-standaardbibliotheekklassen final, bijvoorbeeld java.lang.Systemen java.lang.String. Alle methoden in een finalklasse zijn impliciet final.

  • A finalMethode 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 finalVariabele 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 een blank finalvariabele 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 finalzijn 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. staticvelden zijn velden die niet tot een bepaalde instantie van een klasse behoren.

class C {
    public static int n = 42;
}

Hier is het staticveld nniet gekoppeld aan een bepaalde instantie van Cmaar aan de hele klasse in het algemeen (wat waarom C.nkan worden gebruikt om toegang te krijgen). Kun je nog steeds een instantie van Cgebruiken om toegang te krijgen tot n? Ja, maar het wordt niet als bijzonder goed beschouwd.

finaldaarentegen geeft aan dat een bepaalde variabele niet kan veranderen nadat deze is geïnitialiseerd.

class C {
    public final int n = 42;
}

Hier kan nniet opnieuw worden toegewezen omdat het finalis. Een ander verschil is dat elke variabele finalkan worden verklaard, terwijl niet elke variabele statisch kan worden verklaard.

Klassen kunnen ook als finalworden 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%

staticbetekent dat er slechts één kopie van de variabele in het geheugen is die door alle instanties van de klasse wordt gedeeld.

Het trefwoord finalbetekent alleen dat de waarde niet kan worden gewijzigd. Zonder finalkan 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.

staticis 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 staticblokken, maar ik zou me er om te beginnen geen zorgen over maken.

finalheeft 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.

Other episodes