Instance ve Statik Değişkenler
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 15 / 87.
Şu ana kadar oluşturduğumuz her alan belirli bir nesneye aittir. Her BankAccount kendi balance değerine sahiptir ve her Product kendi name değerine sahiptir. Bunlar örnek değişkenleridir (instance variables) - bir sınıfın her örneği için ayrı ayrı bulunurlar.
Peki ya tüm nesneler arasında paylaşılan verilere ihtiyacınız varsa? İşte burada statik değişkenler (sınıf değişkenleri olarak da adlandırılır) devreye girer. Statik bir değişken, herhangi bir nesneye değil, sınıfın kendisine aittir.
public class Student {
private String name; // Örnek değişkeni - her öğrenci için benzersiz
private static int totalCount; // Statik değişken - tüm öğrenciler tarafından paylaşılır
public Student(String name) {
this.name = name;
totalCount++; // Paylaşılan sayacı artırır
}
public static int getTotalCount() {
return totalCount;
}
}Birden fazla öğrenci oluşturduğunuzda, her birinin kendi name alanı vardır, ancak hepsi aynı totalCount alanını paylaşır:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // Çıktı: 2Statik değişkene bir nesne yerine sınıf adı (Student.getTotalCount()) aracılığıyla nasıl eriştiğimize dikkat edin. Bu, statik üyelerin örneklere değil, sınıfa ait olduğunu vurgular.
Nesneler arasında değişen veriler (bir öğrencinin adı gibi) için örnek değişkenlerini (instance variables) kullanın. Paylaşılması gereken veriler (kaç nesnenin var olduğunu saymak gibi) için statik değişkenleri (static variables) kullanın.
Görev
KolayHem bireysel kitap ayrıntılarını hem de tüm koleksiyonunuzdaki toplam kitap sayısını örnek (instance) ve statik (static) değişkenler kullanarak takip eden bir Book envanter sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
Book.java: Bireysel kitap bilgilerini takip ederken aynı zamanda oluşturulan tüm kitapların sayısını tutan bir Book sınıfı oluşturun:- Bir örnek değişken
title(String) - her kitaba özgü - Bir örnek değişken
price(double) - her kitaba özgü - Bir statik değişken
totalBooks(int) - tüm Book nesneleri arasında paylaşılan ve kaç kitap oluşturulduğunu takip eden - Başlık ve fiyatı alan ve toplam kitap sayısını artıran bir yapıcı (constructor)
- Başlık için bir getter
getTitle() - Fiyat için bir getter
getPrice() - Oluşturulan toplam kitap sayısını döndüren bir statik metot
getTotalBooks()
- Bir örnek değişken
Main.java: Birden fazla Book nesnesi oluşturun ve statik sayacın tüm örnekleri nasıl takip ettiğini gösterin. Girdi olarak üç kitap başlığı ve üç fiyat alacaksınız. Üç kitabı da oluşturduktan sonra dört satır yazdırın:- Her kitabın başlığı ve fiyatı şu formatta:
[title]: $[price](fiyat 2 ondalık basamak olacak şekilde formatlanmış) - Statik metodu kullanarak toplam kitap sayısı:
Total books: [count]
- Her kitabın başlığı ve fiyatı şu formatta:
Sırasıyla altı girdi alacaksınız: title1, price1, title2, price2, title3, price3.
Statik metoda bir nesne örneği üzerinden değil, sınıf adı üzerinden (Book.getTotalBooks()) erişmeyi unutmayın. Fiyatları formatlamak için String.format("%.2f", price) kullanın.
Kopya kağıdı
Bir statik değişken (sınıf değişkeni olarak da adlandırılır), her nesneye özgü olan örnek (instance) değişkenlerin aksine, sınıfın kendisine aittir ve o sınıfın tüm örnekleri arasında paylaşılır.
static anahtar kelimesini kullanarak bir statik değişken tanımlayın:
public class Student {
private String name; // Instance variable - unique per student
private static int totalCount; // Static variable - shared by all students
public Student(String name) {
this.name = name;
totalCount++; // Increments the shared counter
}
public static int getTotalCount() {
return totalCount;
}
}Statik değişkenlere ve metotlara bir nesne örneği üzerinden değil, sınıf adı üzerinden erişin:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // Output: 2Nesneler arasında değişen veriler için örnek (instance) değişkenleri kullanın. Tüm örnekler arasında paylaşılması gereken veriler için statik değişkenleri kullanın.
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Üç kitap için girdileri oku
String title1 = scanner.nextLine();
double price1 = Double.parseDouble(scanner.nextLine());
String title2 = scanner.nextLine();
double price2 = Double.parseDouble(scanner.nextLine());
String title3 = scanner.nextLine();
double price3 = Double.parseDouble(scanner.nextLine());
// TODO: Yukarıdaki girdileri kullanarak üç Book nesnesi oluşturun
// TODO: Her kitabın başlığını ve fiyatını şu formatta yazdırın: [title]: $[price]
// Fiyatı 2 ondalık basamağa biçimlendirmek için String.format("%.2f", price) kullanın
// TODO: Statik yöntemi kullanarak toplam kitap sayısını yazdırın
// Format: Total books: [count]
// Statik yönteme sınıf adı üzerinden erişmeyi unutmayın: Book.getTotalBooks()
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı