1. Statik değişkenler

Bir sınıf belleğe yüklendiğinde hemen statik bir nesne oluşturulur. Bu nesne, statik sınıf değişkenlerini (statik sınıf alanları) depolar. Statik nesne, sınıfın hiçbir sıradan (statik olmayan) nesnesi yaratılmamış olsa bile mevcuttur.

Bir sınıfta değişkenler bildirdiğimizde, bunların yalnızca bir kez mi yaratılacağını yoksa her nesnede bu değişkenlerin farklı örneklerinin mi olması gerektiğini belirtiriz. Varsayılan olarak, her nesne için her değişkenin yeni bir kopyası oluşturulur.

Statik bir değişken, sınıfın statik nesnesine bağlıdır ve her zaman onun tek bir örneği vardır.

staticBir sınıfta statik bir değişken oluşturmak için, anahtar kelimeyi adından önce yazmanız gerekir . Statik bir değişken bildirmek için genel biçim şöyledir:

static Type name = value;

Bir statik değişkene bir başlangıç ​​değeri atanmamışsa, varsayılan bir değerle başlatılır:

Tip Varsayılan değer
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(aynı şey
0
)
boolean
false
Object
ve herhangi bir sınıf
null

Örnekler:

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

Bir sınıfın içinde, statik değişkenlerine yalnızca adlarını kullanarak başvurabilirsiniz. Ancak bunlara başka bir sınıftan erişmek için statik değişkenin adından önce sınıfın adını yazmanız gerekir.

ClassName.variable

Örnek:

Değişken Sınıf Sınıfının dışında bir değişkene erişme
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
değişken private. Sınıfın dışında görünmez.
private static int count = 0;
Counter
değişken private. Sınıfın dışında görünmez.
private static boolean flag;
Arithmetic
değişken private. Sınıfın dışında görünmez.


2. Statik ve statik olmayan değişkenler arasındaki fark

Bir sınıfın statik olmayan (sıradan) değişkenleri, statik olanlarla aynı şekilde, yalnızca anahtar statickelime olmadan bildirilir.

Sıradan değişkenler ile statik değişkenler arasındaki fark nedir?

Bir sınıfın sıradan değişkenleri, sınıfın nesnelerine (sınıfın örnekleri) bağlıdır, statik değişkenler ise sınıfın statik nesnesine bağlıdır.

Bir sınıfın birden çok örneği varsa, bunların her birinin statik olmayan (sıradan) değişkenlerin kendi kopyası vardır. Bir sınıfın statik değişkenleri her zaman statik nesnesinde saklanır ve bunların yalnızca tek bir örneği vardır.

Bir sınıfın sıradan değişkenlerine (alanlarına), yalnızca sınıfın bir nesnesine referansınız varsa erişebilirsiniz. Ve tabii ki sınıfın iç yöntemleri.

Örnek:

Bir nesne referansı kullanarak bir sınıfın alanına erişme
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);
   }
}

Statik değişkenlere her yerden erişebilirsiniz (görünürlük değiştiricileri hesaba kattıktan sonra): sıradan yöntemlerden, aynı sınıfın statik yöntemlerinden, diğer sınıfların yöntemlerinden vb.

Örnek:

Bir nesne referansı kullanmadan bir sınıfın statik alanına erişme
public class DataInfo
{
   public static int value = 100;
}

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

Bellek nasıl düzenlenir:

Diyelim ki Person4 alanlı bir sınıfımız var: ikisi statik, ikisi değil.

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

Sınıfı yükledikten hemen sonra

Java makinesi sınıfı yüklemeyi bitirdiğinde Person, bellek şöyle görünecektir:

İlk nesneyi oluşturduktan sonra

Bir nesne yaratırsak Person, resim şu hale gelir:

Statik ve statik olmayan değişkenler arasındaki fark 2

Lütfen her iki nesnenin de iki değişkeni olmasına rağmen, bunların farklı değişkenler olduğuna dikkat edin: sıradan nesnelerin sıradan değişkenleri vardır ve statik nesnenin statik değişkenleri vardır.

Daha fazla nesneye ihtiyacımız var

İki nesne daha oluşturalım Person. Şimdi bellek şöyle görünecek:

Statik ve statik olmayan değişkenler arasındaki fark 3

Lütfen her nesnenin kendi yaş ve isim değişkenlerine sahip olduğunu unutmayın.



static3. Değiştiriciyi kaldırma ve ekleme

Statikten sıradana

Statik bir değişken alıp değiştiricisini kaldırarak sıradan bir değişkene dönüştürürsek ne olur static? Örneğin, static int sumdeğişken.

Değiştirilen kod şöyle görünecektir:

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

Şimdi bellek şöyle görünür:

Statik ve statik olmayan değişkenler arasındaki fark

Statik değişken, statik nesneden kayboldu ve artık her sıradan nesnenin kendi sumdeğişkeni var.

Sıradandan durağanlığa

Bunun tersini yapabiliriz: değiştiriciyi staticbir sınıfın sıradan değişkenlerine ekleyebiliriz. Tüm sıradan nesnelerden kaybolacaklar ve statik nesnede görünecekler. Diyelim ki ve değişkenlerini statik yapmaya karar verdik . agenameArdından kod şöyle görünecektir:

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

Ve şimdi hafıza şöyle görünecek:

Statik değiştiriciyi kaldırma ve ekleme