clone() Metodu
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 43 / 87.
clone() yöntemi bir nesnenin kopyasını oluşturur. Bunu kullanmak için sınıfınızın Cloneable arayüzünü uygulaması ve Object sınıfındaki clone() yöntemini geçersiz kılması gerekir.
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}Artık nesnelerin bağımsız kopyalarını oluşturabilirsin:
Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy aynı değerlere sahip ayrı bir nesnedirVarsayılan olarak, clone() bir sığ kopyalama gerçekleştirir; yani ilkel değerleri ve referansları kopyalar. Nesneniz alan olarak başka nesneler içeriyorsa hem özgün nesne hem de klon aynı iç içe nesnelere başvurur. İç içe nesnelerle gerçekten bağımsız kopyalar oluşturmak için, clone() yönteminiz içinde bu iç içe nesneleri de klonlayarak bir derin kopyalama uygulamanız gerekir.
Görev
KolayNesne klonlamayı gösteren bir belge yönetim sistemi oluşturalım. Bağımsız kopyalar oluşturmak için klonlanabilen bir Document sınıfı oluşturacaksın; böylece kullanıcılar orijinali koruyarak belgeleri çoğaltabilecek.
Kodunu iki dosya arasında düzenleyeceksin:
Document.java: Klonlamayı destekleyen bir belgeyi temsil eden bir sınıf oluştur. Bir Document üç private alana sahiptir:title(String),author(String) veversion(int). Tüm alanları başlatmak için bir kurucu ve her biri için getter metotları ekle. Ayrıca sürüm numarasını güncellemek için birsetVersion(int version)metodu ekle.Document sınıfının
Cloneablearayüzünü uygulamasını sağla ve birDocumentdöndürecek şekildeclone()metodunu geçersiz kıl. Metot içindeCloneNotSupportedExceptionistisnasını, onu birRuntimeExceptioniçine sararak ele al.toString()metodunu, X, Y ve Z'nin gerçek alan değerleri olduğu şu ifadeyi döndürecek şekilde geçersiz kıl:Document[title=X, author=Y, version=Z].Main.java: Bir belge oluşturup onu klonlayarak Document sınıfını çalışır hâle getir. Üç girdi alacaksın: bir başlık (String), bir yazar (String) ve bir sürüm numarası (int).Bu değerlerle özgün bir Document oluştur, ardından bir kopya oluşturmak için onu klonla. Klonlamadan sonra
setVersion()kullanarak kopyanın sürümünü 1 artır. Bu, klonun gerçekten özgün belgeden bağımsız olduğunu gösterir.Üç satır yazdır:
Original:ve ardından özgün belgenin toString() metoduClone:ve ardından klonlanan belgenin toString() metoduIndependent:ve ardından özgün belge ile klonun farklı nesneler olup olmadığını belirtentrueveyafalse(!=karşılaştırmasını kullan)
Üç girdi alacaksın: belge başlığı (String), yazar adı (String) ve sürüm numarası (int).
Klonun sürümünü değiştirdikten sonra özgün belgenin nasıl değişmeden kaldığına dikkat et. Bu, clone() metodunun gerçekten bağımsız bir kopya oluşturduğunu kanıtlar!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String title = scanner.nextLine();
String author = scanner.nextLine();
int version = scanner.nextInt();
// TODO: Giriş değerleriyle orijinal bir Document oluştur
// TODO: Bir kopya oluşturmak için orijinal belgeyi klonla
// TODO: Klonun version değerini 1 artırarak değiştir
// TODO: "Original: " yazdır ardından orijinal belgeyi
// TODO: "Clone: " yazdır ardından klonlanmış belgeyi
// TODO: "Independent: " yazdır ardından true/false (original != clone kontrolü yap)
}
}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ıKendi başına pratik yap: Online Java derleyicisi