final Anahtar Kelimesi
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 13 / 87.
Java'daki final anahtar kelimesi değişikliği önler. Değişkenlere, metotlara ve sınıflara uygulanabilir ve her birinde farklı bir etkiye sahiptir.
Bir değişkene uygulandığında, final onu bir sabit yapar - bir kez atandığında değeri değiştirilemez:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // Yapıcıda (constructor) bir kez atanabilir
}
public void setRadius(double r) {
// this.radius = r; // Hata! final değişkeni yeniden atanamaz
}
}Bir final değişkeni ya bildirim sırasında ya da yapıcı metot (constructor) içinde başlatılmalıdır. Bundan sonra, ona tekrar değer atama yönündeki herhangi bir girişim derleme hatasına neden olur.
Referans tipleri için final, referansın farklı bir nesneye işaret edemeyeceği, ancak nesnenin içeriğinin hala değişebileceği anlamına gelir:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Hata! Yeniden atama yapılamaz
name.append(" Doe"); // Tamam! Nesne içeriği değişebilirAlanlarla final kullanmak, niyeti açıkça belirtir; diğer geliştiricilere bu değerin başlatıldıktan sonra asla değişmemesi gerektiğini söyler. Bu, özellikle yapılandırma değerleri, ID'ler veya bir nesnenin ömrü boyunca sabit kalması gereken tüm veriler için yararlıdır.
Görev
KolayBir öğrenci kaydedildikten sonra asla değişmemesi gereken verileri korumak için final anahtar kelimesini kullanan bir Student kayıt sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
Student.java: Belirli bilgilerin bir kez ayarlandıktan sonra kalıcı olarak kilitlendiği bir Student sınıfı oluşturun:- Bir
finalalanstudentId(String) - oluşturulurken atanır ve asla değişemez - Bir
finalalanenrollmentYear(int) - öğrencinin kayıt olduğu yıl, bu da kalıcıdır - Normal bir private alan
name(String) - öğrenci adını değiştirirse güncellenebilir - Her üç değeri de alan ve alanları başlatan bir constructor (yapıcı metot)
- Öğrenci kimliği için bir getter
getStudentId() - Kayıt yılı için bir getter
getEnrollmentYear() - İsim için bir getter
getName()ve settersetName() - Şu formatı döndüren bir
getInfo()metodu:"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
- Bir
Main.java: Bir Student nesnesi oluşturun, ardından ismini güncelleyin ve bilgilerini görüntüleyin. Dört girdi alacaksınız: öğrenci kimliği, ilk isim, kayıt yılı ve güncellenecek yeni isim. İki satır yazdırın:- İsim değişikliğinden önceki öğrenci bilgisi
- İsim değişikliğinden sonraki öğrenci bilgisi
Sırasıyla dört girdi alacaksınız: studentId (String), name (String), enrollmentYear (int) ve newName (String).
final alanların öğrencinin kimliğini ve kayıt yılını nasıl koruduğuna dikkat edin - bunlar değişmemesi gereken kalıcı kayıtlardır, isim ise setter metodu aracılığıyla güncellenebilir.
Kopya kağıdı
Java'da final anahtar kelimesi değişikliği önler. Değişkenlere, metotlara ve sınıflara uygulanabilir.
Bir değişkene uygulandığında, final onu bir sabit haline getirir - bir kez atandıktan sonra değeri değiştirilemez:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // Can assign once in constructor
}
public void setRadius(double r) {
// this.radius = r; // Error! Cannot reassign final variable
}
}Bir final değişken ya tanımlandığı sırada ya da kurucu metot (constructor) içinde başlatılmalıdır. Bundan sonra, onu yeniden atamaya yönelik her türlü girişim derleme hatasına neden olur.
Referans tipleri için final, referansın farklı bir nesneyi işaret edemeyeceği anlamına gelir, ancak nesnenin içeriği yine de değişebilir:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Error! Can't reassign
name.append(" Doe"); // OK! Object contents can changeAlanlarla (fields) birlikte final kullanmak niyeti belli eder - bir değerin başlatıldıktan sonra asla değişmemesi gerektiğini belirtir; bu da yapılandırma değerleri, ID'ler veya sabit veriler için kullanışlıdır.
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int enrollmentYear = scanner.nextInt();
scanner.nextLine(); // yeni satır karakterini tüket
String newName = scanner.nextLine();
// TODO: Başlangıç değerleri ile bir Student nesnesi oluşturun
// TODO: İsim değişikliğinden önceki öğrenci bilgilerini yazdırın
// TODO: Setter metodunu kullanarak öğrencinin adını güncelleyin
// TODO: İsim değişikliğinden sonraki öğrenci bilgilerini yazdırın
}
}
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ı