Java’da static ve instance değişken farkı şu soruyla anlaşılır: Bu bilgi sınıfa mı aittir, yoksa oluşturulan nesneye mi? static alan sınıf düzeyinde tek bir ortak değer tutar; instance alan ise her nesne için ayrı değer taşır.
Bu nedenle bir nesnenin alanı değiştiğinde diğer nesneler de etkileniyorsa, büyük olasılıkla nesneye özel olması gereken alan yanlışlıkla static tanımlanmıştır. İlk kararın şu olsun: Bu bilgi tüm nesneler için ortak mı, yoksa her nesneye göre değişiyor mu?
Bir alan neden tüm nesnelerde aynı değeri gösterebilir?
Java’da sınıf, benzer nesnelerin hangi alanlara ve davranışlara sahip olacağını tanımlayan yapıdır. Nesne ise bu sınıftan oluşturulan tekil örnektir. Örneğin Student sınıfından iki farklı öğrenci nesnesi oluşturabilirsin.
Bir alan static olarak tanımlandığında, bu alan her nesne için yeniden oluşturulmaz. Sınıfa bağlı tek bir ortak alan bulunur. Bir nesne bu değeri değiştirirse, aynı sınıftan oluşturulan diğer nesneler de yeni değeri görür.
Instance alanlarda ise durum farklıdır. static olmayan bir alan, oluşturulan her nesnenin kendi içinde ayrı tutulur. Bu yüzden iki öğrencinin adı, yaşı veya okul bilgisi birbirinden farklı olabilir.
| Özellik | static alan | instance alan |
|---|---|---|
| Kime aittir? | Sınıfa | Nesneye |
| Kaç ortak değer vardır? | Sınıf için tek ortak değer | Her nesne için ayrı değer |
| Ne zaman kullanılır? | Toplam sayı veya ortak ayar gibi bilgilerde | Ad, yaş veya kişisel durum gibi bilgilerde |
Örneğin “oluşturulan toplam öğrenci sayısı” sınıfa ait ortak bir bilgidir. Ancak “öğrencinin adı” her nesneye göre değiştiği için instance alan olmalıdır.
Ad bilgisini static yapmak neden hataya yol açar?

Aşağıdaki örnekte name alanı yanlışlıkla static tanımlanmıştır. totalStudents alanının static olması ise doğrudur; çünkü toplam sayı tüm öğrenciler için ortak olarak tutulabilir.
public class Student {
static String name;
static int totalStudents;
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "Ayşe";
Student.totalStudents++;
Student student2 = new Student();
student2.name = "Mehmet";
Student.totalStudents++;
System.out.println(student1.name);
System.out.println(student2.name);
System.out.println(Student.totalStudents);
}
}
Beklenen çıktı:
Mehmet
Mehmet
2
Kodun akışı şöyledir:
Student student1 = new Student();satırı ilk nesneyi oluşturur.student1.name = "Ayşe";satırı, nesneye özel bir alanı değil, sınıfın ortaknamealanınıAyşeyapar.Student.totalStudents++;toplam öğrenci sayısını 1 artırır.Student student2 = new Student();ikinci nesneyi oluşturur.student2.name = "Mehmet";yeni bir ad alanı oluşturmaz; ortaknamedeğerinin üzerineMehmetyazar.- Sonraki iki
printlnsatırı aynı ortak alanı okuduğu için iki kezMehmetyazdırır. - Toplam sayı iki nesne oluşturulduğu için
2olur.
Buradaki hata, iki nesnenin farklı adlara sahip olması beklenirken ad bilgisinin sınıfa ait ortak bir alanda tutulmasıdır. name instance, totalStudents ise static olmalıdır.
Doğru çözüm: Ad instance, toplam sayı static olmalı
Bir öğrencinin adı yalnızca o öğrenci nesnesine aittir. Bu nedenle name alanı instance olmalıdır. Toplam öğrenci sayısı ise bütün nesneler için ortak tutulabileceğinden static tanımlanabilir.
class Student {
String name;
static int count = 0;
}
public class Main {
public static void main(String[] args) {
Student firstStudent = new Student();
firstStudent.name = "Ada";
Student.count++;
Student secondStudent = new Student();
secondStudent.name = "Mert";
Student.count++;
System.out.println(firstStudent.name);
System.out.println(secondStudent.name);
System.out.println(Student.count);
}
}
Beklenen çıktı:
Ada
Mert
2
Kodun çalışma sırasını inceleyelim:
String name;satırındastatickullanılmadığı için oluşturulan herStudentnesnesi kendinamealanına sahip olur.static int count = 0;sınıfa ait tek bir ortak sayaç oluşturur.firstStudent.name = "Ada";yalnızca ilk nesnenin adını değiştirir.secondStudent.name = "Mert";yalnızca ikinci nesnenin adını değiştirir; Ada bilgisi korunur.- Her nesne oluşturulduktan sonra
Student.count++çalışır ve ortak sayaç bir artırılır. - İlk iki çıktı nesnelerin kendi alanlarından, son çıktı ise sınıfa ait ortak
countdeğerinden üretilir.
Teşhis kuralı nettir: Bir değer nesneye göre değişiyorsa instance, bütün nesneler için tek ortak değer gerekiyorsa static olmalıdır.
Static metot instance alanına neden doğrudan erişemez?

Static metot sınıfa aittir ve çağrılmak için belirli bir nesneye ihtiyaç duymaz. Instance alan ise belirli bir nesnenin parçasıdır. Bu nedenle static metot, hangi nesnenin name alanının kullanılacağını kendi başına bilemez.
class Student {
String name;
static void printName() {
System.out.println(name);
}
}
Bu kod derlenmez. Sorun System.out.println(name); satırındadır: printName() static olduğu hâlde name bir instance alanıdır. Ortada seçilmiş bir Student nesnesi bulunmadığından doğrudan erişim kurulamaz.
Çözüm olarak metoda kullanılacak nesne geçirilebilir:
class Student {
String name;
static void printName(Student student) {
System.out.println(student.name);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.name = "Ada";
Student.printName(student);
}
}
Beklenen çıktı:
Ada
printName(Student student)metodu hangi nesneyle çalışacağını parametre üzerinden öğrenir.student.nameifadesi, adı belirsiz biçimde istemek yerine verilen nesnenin alanına erişir.Student.printName(student)çağrısı oluşturulan nesneyi static metoda gönderir.
Kısacası static metot belirli bir nesne bağlamında çalışmaz. Bir instance alanına erişmesi gerekiyorsa kullanılacak nesne açıkça belirtilmelidir.
Static mi instance mı? Hızlı karar kontrol listesi
Bir alanı tanımlamadan önce şu soruyu sor: Bu veri sınıfa mı ait, yoksa oluşturulan her nesneye ayrı ayrı mı ait? Aşağıdaki kontrol listesi, karar vermeyi kolaylaştırır.
- Değer tüm nesneler için aynı mı? Aynı olması gerekiyorsa alan
staticolabilir. Örneğin bir sınıfın ortak sabiti veya oluşturulan toplam öğrenci sayısı sınıfa ait ortak verilerdir. - Her nesne kendi değerini mi taşıyor? Bir öğrencinin adı, bir hesabın bakiyesi veya bir kitabın başlığı gibi değerler nesneye özeldir. Bu alanlar instance olarak tanımlanmalıdır.
- Değer, nesne oluşturulmadan anlamlı mı? Veriyi kullanmak için belirli bir nesneye ihtiyaç yoksa
staticseçimi düşünülebilir. Ancak değer belirli bir nesnenin durumunu anlatıyorsa instance alanı daha uygundur. - Bir nesnedeki değişiklik diğer nesneleri de etkilemeli mi? Evetse ortak bir
staticalan söz konusu olabilir. Hayırsa her nesnenin bağımsız değer taşıması gerekir. - Alan kimin yaşam döngüsüne bağlı? Değer sınıfın tamamı var olduğu sürece ortak biçimde tutulacaksa
staticdüşünülebilir. Her nesne oluşturulurken ortaya çıkıyor ve o nesneyle birlikte anlam taşıyorsa instance alan kullanılmalıdır.
| Alan türü | Uygun kullanım | Örnek |
|---|---|---|
| Ortak sabit | Tüm nesneler için değişmeyen ortak bilgi | Bir sınıfın ortak kapasite değeri |
| Sayaç | O sınıftan kaç nesne üretildiğini takip etme | totalStudents |
| Nesneye özel nitelik | Her nesnenin bağımsız olarak taşıdığı bilgi | name, studentNumber |
Örneğin Student sınıfındaki name alanı static olmamalıdır; çünkü her öğrencinin adı farklı olabilir. Buna karşılık toplam öğrenci sayısı tüm nesneler için ortak takip edilecekse static tanımlanabilir. Bir alanı seçerken “ortak veri mi, nesneye özel veri mi?” sorusuna net cevap veremiyorsan, sınıfındaki kullanım amacını ve değişikliğin hangi nesneleri etkilemesi gerektiğini yeniden incele. Kendi seviyeni görmek için Java bilgi testini çözerek hangi konuları pekiştirmen gerektiğini belirleyebilirsin.
Java öğrenirken bu ayrımı nasıl pekiştirebilirsin?
Static ve instance ayrımını kalıcı hâle getirmenin en iyi yollarından biri, kavramları sırayla uygulamaktır. Önce bir sınıftaki alanların hangi nesneye ait olduğunu belirle; ardından bu alanları kullanan metotları yaz. Daha sonra kapsülleme ve birden fazla nesnenin durumunu yöneten daha büyük örneklere geç.
static kullanımını ezberlenecek bir kural gibi görme. Her alan için şu iki soruyu yazılı olarak cevapla: Bu bilgi tüm nesneler için ortak mı? ve Bir nesnenin değeri değiştiğinde diğer nesneler etkilenmeli mi? Cevaplar farklı nesnelerin bağımsız kalması gerektiğini gösteriyorsa instance alan kullan.
Bu ayrımı çalışmak için küçük bir uygulama oluşturabilirsin: İki öğrenci nesnesi üret, adlarını farklı ata ve toplam öğrenci sayısını ayrı bir static sayaçla izle. Ardından bir öğrencinin adını değiştirip diğer öğrencinin adının aynı kaldığını kontrol et. Daha yapılandırılmış ve kişiye göre ilerleyen bir çalışma arıyorsan Java birebir programı bu temel konuları uygulamalar üzerinden çalışmak için değerlendirilebilir.
Bir sonraki pratik adım olarak kendi yazdığın üç sınıftaki tüm alanları listele ve her birinin yanına “ortak” veya “nesneye özel” notunu düş. Ardından yalnızca gerekçesini açıklayabildiğin alanları static olarak bırak.
Sık Sorulan Sorular
Bir instance değişkenin değeri değişince neden başka bir nesnenin değeri değişmez?
Çünkü her nesne, instance değişken için kendisine ait ayrı bir değer tutar. Bir öğrencinin name alanını değiştirmek, başka bir Student nesnesinin kendi name alanını değiştirmez.
Bir sayacı static yapmak hangi durumlarda uygundur?
Sayaç, sınıftan oluşturulan tüm nesnelerin ortak toplamını veya sınıf düzeyindeki bir durumu izliyorsa static yapılabilir. Her nesnenin kendi bağımsız sayacı olması gerekiyorsa instance alan tercih edilmelidir.
Static bir metot instance değişkene erişmek için neden nesneye ihtiyaç duyar?
Static metot sınıfa ait çalışır; belirli bir nesnenin instance alanını kendiliğinden bilemez. Bu nedenle hangi nesnenin alanına erişeceğini belirtmek için bir nesne üzerinden işlem yapması gerekir.
Bir alanın static olup olmaması nasıl hızlı şekilde kontrol edilir?
Alan tüm nesneler için ortak mı, yoksa her nesne kendi değerini mi taşıyor diye sor. Ortak veri için static, nesneye özel veri için instance yaklaşımı kullanılır. Ayrıca bir nesnedeki değişikliğin diğer nesneleri etkilemesi gerekip gerekmediğini kontrol et.
Bu ayrımı doğru kurduğunda Java sınıflarındaki verilerin hangi düzeyde tutulması gerektiğini daha kolay anlayabilir ve nesneler arasındaki beklenmedik değer değişikliklerini önleyebilirsin.