1. Statische Variablen

Wenn eine Klasse in den Speicher geladen wird, wird sofort ein statisches Objekt erstellt. Dieses Objekt speichert statische Klassenvariablen (statische Klassenfelder). Das statische Objekt existiert auch dann, wenn keine gewöhnlichen (nicht statischen) Objekte der Klasse erstellt wurden.

Wenn wir Variablen in einer Klasse deklarieren, geben wir an, ob sie nur einmal erstellt werden oder ob es in jedem Objekt unterschiedliche Instanzen dieser Variablen geben soll. Standardmäßig wird für jedes Objekt eine neue Kopie jeder Variablen erstellt.

Eine statische Variable ist an das statische Objekt der Klasse gebunden und es gibt immer eine einzelne Instanz davon.

staticUm eine statische Variable in einer Klasse zu erstellen, müssen Sie das Schlüsselwort vor ihren Namen schreiben . Das allgemeine Format zum Deklarieren einer statischen Variablen ist:

static Type name = value;

Wenn einer statischen Variablen kein Anfangswert zugewiesen wird, wird sie mit einem Standardwert initialisiert:

Typ Standardwert
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(das Gleiche wie
0
)
boolean
false
Object
und alle Klassen
null

Beispiele:

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

Innerhalb einer Klasse können Sie auf ihre statischen Variablen verweisen, indem Sie einfach deren Namen verwenden. Um jedoch von einer anderen Klasse aus darauf zuzugreifen, müssen Sie den Namen der Klasse vor den Namen der statischen Variablen schreiben.

ClassName.variable

Beispiel:

Variable Klasse Zugriff auf eine Variable außerhalb ihrer Klasse
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Die Variable ist private. Es ist außerhalb der Klasse nicht sichtbar.
private static int count = 0;
Counter
Die Variable ist private. Es ist außerhalb der Klasse nicht sichtbar.
private static boolean flag;
Arithmetic
Die Variable ist private. Es ist außerhalb der Klasse nicht sichtbar.


2. Unterschied zwischen statischen und nicht statischen Variablen

Nicht-statische (gewöhnliche) Variablen einer Klasse werden auf die gleiche Weise deklariert wie statische, nur ohne das staticSchlüsselwort.

Was ist der Unterschied zwischen gewöhnlichen Variablen und statischen Variablen?

Gewöhnliche Variablen einer Klasse sind an Objekte der Klasse (Instanzen der Klasse) gebunden, während statische Variablen an das statische Objekt der Klasse gebunden sind.

Wenn es mehrere Instanzen einer Klasse gibt, verfügt jede von ihnen über eine eigene Kopie der nicht statischen (gewöhnlichen) Variablen. Statische Variablen einer Klasse werden immer in ihrem statischen Objekt gespeichert und es existiert nur eine einzige Instanz von ihnen.

Sie können nur dann auf die gewöhnlichen Variablen (Felder) einer Klasse zugreifen, wenn Sie über eine Referenz auf ein Objekt der Klasse verfügen. Und natürlich innerhalb der Methoden der Klasse.

Beispiel:

Zugriff auf ein Feld einer Klasse mithilfe einer Objektreferenz
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);
   }
}

Sie können von überall auf statische Variablen zugreifen (nach Berücksichtigung der Sichtbarkeitsmodifikatoren): von gewöhnlichen Methoden, von statischen Methoden derselben Klasse, von Methoden anderer Klassen usw.

Beispiel:

Zugriff auf ein statisches Feld einer Klasse ohne Verwendung einer Objektreferenz
public class DataInfo
{
   public static int value = 100;
}

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

So ist das Gedächtnis organisiert:

Nehmen wir an, wir haben eine PersonKlasse mit 4 Feldern: zwei sind statisch und zwei nicht.

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

Unmittelbar nach dem Laden der Klasse

Wenn die Java-Maschine das Laden der Klasse abgeschlossen hat Person, sieht der Speicher folgendermaßen aus:

Nach dem Erstellen des ersten Objekts

Wenn wir ein PersonObjekt erstellen, sieht das Bild so aus:

Unterschied zwischen statischen und nicht statischen Variablen 2

Bitte beachten Sie, dass beide Objekte zwar zwei Variablen haben, diese jedoch unterschiedliche Variablen sind: Die gewöhnlichen Objekte haben gewöhnliche Variablen und das statische Objekt hat die statischen Variablen.

Wir brauchen mehr Objekte

Lassen Sie uns zwei weitere PersonObjekte erstellen. Jetzt sieht die Erinnerung so aus:

Unterschied zwischen statischen und nicht statischen Variablen 3

Bitte beachten Sie, dass jedes Objekt seine eigenen Alters- und Namensvariablen hat.



3. Entfernen und Hinzufügen des staticModifikators

Von statisch bis gewöhnlich

Was passiert, wenn wir eine statische Variable nehmen und sie in eine gewöhnliche Variable umwandeln, indem wir ihren staticModifikator entfernen? Zum Beispiel die static int sumVariable.

Der geänderte Code sieht folgendermaßen aus:

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

Jetzt sieht die Erinnerung so aus:

Unterschied zwischen statischen und nicht statischen Variablen

Die statische Variable ist aus dem statischen Objekt verschwunden und jetzt hat jedes gewöhnliche Objekt seine eigene sumVariable.

Von gewöhnlich bis statisch

Wir können das Gegenteil tun: den staticModifikator zu gewöhnlichen Variablen einer Klasse hinzufügen. Sie verschwinden von allen gewöhnlichen Objekten und erscheinen im statischen Objekt. Angenommen, wir beschließen, die Variablen und statisch zu machen . agenameDann sieht der Code so aus:

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

Und jetzt sieht die Erinnerung so aus:

Entfernen und Hinzufügen des statischen Modifikators