1. Statische variabelen

Wanneer een klasse in het geheugen wordt geladen, wordt er onmiddellijk een statisch object gemaakt. Dit object slaat statische klassevariabelen op (statische klassevelden). Het statische object bestaat zelfs als er geen gewone (niet-statische) objecten van de klasse zijn gemaakt.

Wanneer we variabelen in een klasse declareren, geven we aan of ze slechts één keer worden gemaakt, of dat er afzonderlijke instanties van deze variabelen in elk object moeten zijn. Standaard wordt voor elk object een nieuwe kopie van elke variabele gemaakt.

Een statische variabele is gebonden aan het statische object van de klasse en er is altijd een enkele instantie van.

Om een ​​statische variabele in een klasse te maken, moet u het statictrefwoord voor de naam ervan schrijven. Het algemene formaat voor het declareren van een statische variabele is:

static Type name = value;

Als aan een statische variabele geen initiële waarde is toegewezen, wordt deze geïnitialiseerd met een standaardwaarde:

Type Standaardwaarde
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(hetzelfde als
0
)
boolean
false
Object
en eventuele lessen
null

Voorbeelden:

Code Opmerking
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Binnen een klasse kun je eenvoudig naar de statische variabelen verwijzen door hun namen te gebruiken. Maar om toegang te krijgen tot een andere klasse, moet u de naam van de klasse vóór de naam van de statische variabele schrijven.

ClassName.variable

Voorbeeld:

Variabel Klas Toegang tot een variabele buiten zijn klasse
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
De variabele is private. Het is niet zichtbaar buiten de klas.
private static int count = 0;
Counter
De variabele is private. Het is niet zichtbaar buiten de klas.
private static boolean flag;
Arithmetic
De variabele is private. Het is niet zichtbaar buiten de klas.


2. Verschil tussen statische en niet-statische variabelen

Niet-statische (gewone) variabelen van een klasse worden op dezelfde manier gedeclareerd als statische variabelen, alleen zonder het statictrefwoord.

Wat is het verschil tussen gewone variabelen en statische variabelen?

Gewone variabelen van een klasse zijn gebonden aan objecten van de klasse (exemplaren van de klasse), terwijl statische variabelen zijn gebonden aan het statische object van de klasse.

Als er meerdere instanties van een klasse zijn, heeft elk van hen zijn eigen kopie van de niet-statische (gewone) variabelen. Statische variabelen van een klasse worden altijd opgeslagen in het statische object en er bestaat slechts één exemplaar van.

Je hebt alleen toegang tot de gewone variabelen (velden) van een klasse als je een verwijzing hebt naar een object van de klasse. En binnen de methoden van de klas, natuurlijk.

Voorbeeld:

Toegang krijgen tot een veld van een klasse met behulp van een objectreferentie
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

U kunt overal toegang krijgen tot statische variabelen (na rekening te hebben gehouden met de zichtbaarheidsmodificatoren): van gewone methoden, van statische methoden van dezelfde klasse, van methoden van andere klassen, enz.

Voorbeeld:

Toegang krijgen tot een statisch veld van een klasse zonder een objectreferentie te gebruiken
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Hoe het geheugen is georganiseerd:

Laten we zeggen dat we een Personklasse hebben met 4 velden: twee zijn statisch en twee niet.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Onmiddellijk na het laden van de klasse

Wanneer de Java-machine klaar is met het laden van de Personklasse, ziet het geheugen er als volgt uit:

Na het maken van het eerste object

Als we een Personobject maken, wordt de afbeelding dit:

Verschil tussen statische en niet-statische variabelen 2

Houd er rekening mee dat hoewel beide objecten twee variabelen hebben, dit verschillende variabelen zijn: de gewone objecten hebben gewone variabelen en het statische object heeft de statische variabelen.

We hebben meer objecten nodig

Laten we nog twee Personobjecten maken. Het geheugen ziet er nu zo uit:

Verschil tussen statische en niet-statische variabelen 3

Houd er rekening mee dat elk object zijn eigen leeftijds- en naamvariabelen heeft.



static3. De modifier verwijderen en toevoegen

Van statisch tot gewoon

Wat gebeurt er als we een statische variabele nemen en deze in een gewone veranderen door de staticmodifier te verwijderen? Bijvoorbeeld de static int sumvariabele.

De gewijzigde code ziet er als volgt uit:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

Het geheugen ziet er nu zo uit:

Verschil tussen statische en niet-statische variabelen

De statische variabele verdween uit het statische object en nu heeft elk gewoon object zijn eigen sumvariabele.

Van gewoon tot statisch

We kunnen het tegenovergestelde doen: de staticmodifier toevoegen aan gewone variabelen van een klasse. Ze verdwijnen uit alle gewone objecten en verschijnen in het statische object. Stel dat we besluiten de variabelen en statisch te maken . agenameDan ziet de code er zo uit:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

En nu ziet het geheugen er zo uit:

De statische modifier verwijderen en toevoegen