Wat doet het zoekwoord ‘static’ in een klas?

Om precies te zijn, ik probeerde deze code:

package hello;
public class Hello {
    Clock clock = new Clock();
    public static void main(String args[]) {
        clock.sayTime();
    }
}

Maar het gaf de fout

Geen toegang tot niet-statisch veld in statische methode hoofd

Dus ik heb de verklaring van Clockgewijzigd in dit:

static Clock clock = new Clock();

En het werkte. Wat betekent het om dat trefwoord voor de aangifte te plaatsen? Wat zal het precies doen en/of beperken in termen van wat er met dat object kan worden gedaan?


Antwoord 1, autoriteit 100%

staticleden behoren tot de klas in plaats van tot een specifieke instantie.

Het betekent dat slechts één exemplaar van een staticveld bestaat[1]zelfs als u een miljoen exemplaren van de klasse maakt of u maak er geen aan. Het wordt door alle instanties gedeeld.

Omdat staticmethoden ook niet tot een specifieke instantie behoren, kunnen ze niet verwijzen naar instantieleden. In het gegeven voorbeeld weet mainniet naar welke instantie van de klasse Hello(en dus naar welke instantie van de klasse Clock) het moet verwijzen . staticleden kunnen alleen verwijzen naar staticleden. Instantieleden hebben natuurlijk toegang tot staticleden.

Kanttekening:natuurlijk hebben staticleden toegang tot instantieleden via een objectreferentie.

Voorbeeld:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;
        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]: Afhankelijk van de runtime-kenmerken kan het er één zijn per ClassLoader of AppDomain of thread, maar dat doet er niet toe.


Antwoord 2, autoriteit 20%

Het betekent dat er slechts één exemplaar van “clock” in Hello is, niet één per elk afzonderlijk exemplaar van de “Hello”-klasse, of meer, het betekent dat er één algemeen gedeelde “clock”-referentie is tussen alle instanties van de klasse “Hallo”.

Dus als je ergens in je code een “nieuwe Hallo” zou doen:
A- in het eerste scenario (vóór de wijziging, zonder “statisch” te gebruiken), zou het elke keer dat een “nieuwe Hallo” wordt aangeroepen een nieuwe klok maken, maar
B- in het tweede scenario (na de wijziging, met behulp van “statisch”), zou elke “nieuwe Hello”-instantie nog steeds de oorspronkelijke en dezelfde “klok”-referentie delen en gebruiken die eerst werd gemaakt.

Tenzij je “klok” ergens buiten het hoofdstation nodig had, zou dit net zo goed werken:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}

Antwoord 3, autoriteit 15%

Het statictrefwoord betekent dat iets (een veld, methode of geneste klasse) gerelateerd is aan het typein plaats van aan een bepaald exemplaarvan het type. Dus men roept bijvoorbeeld Math.sin(...)aan zonder enige instantie van de klasse Math, en inderdaad je kunt nietmaken een instantie van de klasse Math.

Zie voor meer informatie de relevante gedeelte van Oracle’s Java Tutorial.


Sidenote

Java staat u helaas toetoegang te krijgen tot statische leden alsof het instantieleden zijn, bijvoorbeeld

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

Daardoor lijktalsof sleepeen instantiemethode is, maar het is eigenlijk een statische methode – het altijdmaakt de huidige thread in slaapstand . Het is beter om dit duidelijk te maken in de belcode:

// Clearer
Thread.sleep(5000);

Antwoord 4, autoriteit 6%

Het statictrefwoord in Java betekent dat de variabele of functie wordt gedeeld tussen alle instanties van die klasse, aangezien deze tot het typebehoort, niet de eigenlijke objecten zelf.

Dus als je een variabele hebt: private static int i = 0;en je verhoogt deze (i++) in één instantie, dan wordt de wijziging in alle instanties doorgevoerd . izal nu in alle gevallen 1 zijn.

Statische methoden kunnen worden gebruikt zonder een object te instantiëren.


Antwoord 5, autoriteit 4%

Basisgebruik van statische leden…

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}
class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}
class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

Zo kun je waarden delen met alle klasleden zonder klasinstantie Hallo naar een andere klas te sturen. En met static hoef je geen klasse-instantie te maken.

Hello hello = new Hello();
hello.staticValue = "abc";

Je kunt statische waarden of methoden gewoon aanroepen op klassenaam:

Hello.staticValue = "abc";

Antwoord 6, autoriteit 3%

Statisch betekent dat u geen instantie van de klasse hoeft te maken om de methoden of variabelen te gebruiken die aan de klasse zijn gekoppeld. In jouw voorbeeld zou je kunnen bellen:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

direct, in plaats van:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

Vanuit een statische methode (die bij een klasse hoort) heb je geen toegang tot leden die niet statisch zijn, omdat hun waarden afhangen van je instantie van de klasse. Een niet-statisch Clock-object, dat een instantielid is, zou een andere waarde/referentie hebben voor elke instantie van uw Hello-klasse, en daarom zou u er geen toegang toe hebben vanuit het statische gedeelte van de klasse.


Antwoord 7, autoriteit 3%

Statisch in Java:

Static is een niet-toegangsmodificatie.
Het statische sleutelwoord behoort tot de klasse dan instantie van de klasse.
kan worden gebruikt om een ​​variabele of methode aan een klasse toe te voegen.

Statisch zoekwoord KAN worden gebruikt met:

Methode

Variabele

Klasse genest binnen een andere klasse

Initialisatieblok

KAN NIET worden gebruikt met:

Klasse (niet genest)

Constructeur

Interfaces

Methode Lokale Innerlijke Klasse (Verschil dan geneste klasse)

Inner Class-methoden

Instantievariabelen

Lokale variabelen

Voorbeeld:

Stel je het volgende voorbeeld voor met een instantievariabele met de naam countdie in de constructor wordt opgehoogd:

package pkg;
class StaticExample {
    int count = 0;// will get memory when instance is created
    StaticExample() {
        count++;
        System.out.println(count);
    }
    public static void main(String args[]) {
        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();
    }
}

Uitvoer:

1 1 1

Aangezien de instantievariabele het geheugen ophaalt op het moment dat het object wordt gemaakt, heeft elk object de kopie van de instantievariabele. Als deze wordt verhoogd, wordt deze niet weerspiegeld in andere objecten.

Als we nu het aantal instantievariabelen veranderen in een statische, zal het programma een andere uitvoer produceren:

package pkg;
class StaticExample {
    static int count = 0;// will get memory when instance is created
    StaticExample() {
        count++;
        System.out.println(count);
    }
    public static void main(String args[]) {
        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();
    }
}

Uitvoer:

1 2 3

In dit geval krijgt de statische variabele het geheugen maar één keer. Als een object de waarde van de statische variabele verandert, behoudt het zijn waarde.

Statisch met finale:

De globale variabele die is gedeclareerd als definitief en statischblijft ongewijzigd voor de hele uitvoering. Omdat statische leden worden opgeslagen in het klassengeheugen en slechts één keer worden geladen in de hele uitvoering. Ze zijn gemeenschappelijk voor alle objecten van de klasse. Als u statische variabelen als definitief declareert, kan geen van de objecten hun waarde wijzigen omdat deze definitief is. Daarom worden variabelen die als definitief en statisch zijn gedeclareerd soms ook wel constanten genoemd. Alle velden van interfaces worden constanten genoemd, omdat ze standaard definitief en statisch zijn.

voer hier de afbeeldingsbeschrijving in

Beeldbron: Laatste Statisch


Antwoord 8, autoriteit 2%

Laat me proberen met een foto om toe te voegen aan bestaande antwoorden:

Op ALLE spaarrekeningen wordt een rentepercentage van 2% toegepast. Daarom is het statisch.

Een saldo moet individueelzijn, dus het is nietstatisch.

voer hier de afbeeldingsbeschrijving in


Antwoord 9, autoriteit 2%

Deze discussie heeft tot nu toe geen rekening gehouden met classloader-overwegingen. Strikt genomen worden statische Java-velden gedeeld tussen alle instanties van een klasse voor een gegeven classloader.


Antwoord 10

Een veld kan worden toegewezen aan de klasse of aan een instantie van een klasse. Standaard zijn velden instantievariabelen. Door staticte gebruiken wordt het veld een klassevariabele, er is dus één en slechts één clock. Als je op één plek een wijziging aanbrengt, is deze overal zichtbaar. Instantievariabelen worden onafhankelijk van elkaar gewijzigd.


11

Statische methoden gebruiken geen zinsvariabelen van de klasse die ze zijn gedefinieerd in. Een zeer goede uitleg van het verschil is te vinden op Deze pagina


12

Ik heb een smaak ontwikkeld voor statische methoden (alleen, indien mogelijk) in “helper” -klassen.

De callingklasse hoeft geen ander lid (instantie) variabele van de helperklasse te maken. Je belt gewoon de methoden van de helperklasse. Ook is de helperklasse verbeterd omdat u geen constructeur meer nodig hebt, en u hebt geen lid (exemplaar) variabelen nodig.

Er zijn waarschijnlijk andere voordelen.


13

kan ook denken aan statische leden die geen “deze” aanwijzer hebben. Ze worden onder alle gevallen gedeeld.

Other episodes