Bölüm 4: Nesne ve Sınıflar
Çoktan Seçmeli · Nesne Yönelimli Programlama
Soru 1: Sınıf ve Nesne
Aynı sınıftan new ile üretilen iki nesne için hangisi doğrudur?
A: Sınıf bir taslaktır; her nesne örnek alanlarının kendi kopyasını taşır. Metot kodu tektir, hangi nesnenin verisiyle çalışacağını this belirler (C yanlış). Alanların paylaşılması yalnızca static alanlar için geçerlidir (B).
Çoktan Seçmeli · Sınıf ve Nesne
Soru 2: Paket Erişimi
Bir sınıfta erişim belirleyicisi yazılmadan tanımlanan int sayac; alanına doğrudan kimler erişebilir?
C: Belirleyici yazılmazsa paket erişimi (package-private) geçerlidir: sınıfın kendisi ve aynı paketteki sınıflar erişir. A private, B public düzeyidir; başka paketteki alt sınıf paket erişimli üyeyi göremez.
Çoktan Seçmeli · Yapıcı Metotlar
Soru 3: Ad ve Varsayılan Değer
Program derlenir mi? Derlenirse ne yazar?
public class Ornek2 { private static int $; public static void main(String[] args) { String deger_1 = "1"; System.out.print($); System.out.print(deger_1); } }
B: $ geçerli bir addır (harf, rakam, _ ve $; rakamla başlayamaz). Alanlar varsayılan değer alır: static int alan 0 olur. İki print satır atlamadan yan yana yazar: 01. Yerel değişkenler ise varsayılan değer almaz; ilk değer verilmeden okunamaz.
Çıktı Sorusu · Yapıcı Metotlar
Soru 4: Üç Yapıcılı Kutu
main içinde new Kutu(); System.out.println(); new Kutu(1); System.out.println(); çalıştırılıyor. Program ne yazar?
class Kutu { int en; Kutu() { this(2); System.out.print("A" + en); } Kutu(int en) { this(en, en * 3); System.out.print("B" + en); } Kutu(int en, int boy) { this.en = en + boy; System.out.print("C" + this.en); } }
Cevabı göster
C8B2A8 C4B1
Kutu()öncethis(2), o dathis(2, 6)çağırır: en = 2 + 6 = 8 →C8.- Zincir geri sararken her yapıcı kendi gövdesinin kalanını çalıştırır:
B2(parametreen= 2), sonraA8(alanen= 8). new Kutu(1):this(1, 3)→C4, ardındanB1. Parametresiz yapıcı hiç çalışmaz.
Adım Adım Çalıştırma · Yapıcı Metotlar
Soru 5: this(...) ile Yapıcı Zinciri
İki nesne oluşturuluyor. Alanlar hangi yapıcıda, hangi sırayla değer alır? Program ne yazar?
new heap’te nesneyi ayırır; alanlar varsayılan değer alır: renk = null, kat = 0. Parametresiz yapıcı başlar.
this("beyaz") aynı nesne için öteki yapıcıyı çağırır: yeni bir çerçeve açılır, ikisinde de this #1’i gösterir.
this.renk nesnenin alanı, sağdaki renk parametredir: alan "beyaz" olur.
Parametreli yapıcı kat’ı 1 yapar ve biter; çerçevesi kapanır.
Parametresiz yapıcı kaldığı yerden sürer: kat = 2. Son yazan kazanır; 1 değeri ezildi.
İki yapıcı da bitti; new ifadesinin değeri olan referans e’ye atanır.
İkinci nesne doğrudan TrRenk(String) ile kurulur: "mavi" ve 1. Parametresiz yapıcı bu kez hiç çalışmaz.
Çıktı: beyaz 2 ve mavi 1. Her nesne kendi alanlarını taşır.
public class TrRenk { private String renk; private int kat; public TrRenk() { this("beyaz"); kat = 2; } public TrRenk(String renk) { this.renk = renk; kat = 1; } public static void main(String[] args) { TrRenk e = new TrRenk(); TrRenk f = new TrRenk("mavi"); System.out.println(e.renk + " " + e.kat); System.out.println(f.renk + " " + f.kat); } }
Çıktı Sorusu · Alanlar
Soru 6: İlklendirme Sırası
main şöyle: System.out.print("M"); new B(); new B(); System.out.println();. Program ne yazar?
class B { static { System.out.print("S"); } int x = yaz("F"); { System.out.print("I"); } B() { System.out.print("C"); } static int yaz(String s) { System.out.print(s); return 1; } }
Cevabı göster
MSFICFIC
mainönceMyazar;Bsınıfı ilknew B()’de yüklenir vestaticblok bir kez çalışır:S.- Her nesnede sıra: alan ilk değerleri ve örnek ilklendirici blokları yazılış sırasıyla (
F,I), sonra yapıcının gövdesi (C). - İkinci nesnede
staticblok yeniden çalışmaz:FIC.
Çoktan Seçmeli · Metotlar
Soru 7: Eksik return
Bu metot için hangisi doğrudur?
static int isaret(int x) { if (x > 0) return 1; else if (x < 0) return -1; }
C: int döndüren metodun her yolu return ile bitmelidir. x == 0 olduğunda iki koşul da yanlıştır ve metodun sonuna ulaşılır; derleyici bunu görür ve programı hiç çalıştırmaz. Çözüm: sona return 0; eklemek.
Çoktan Seçmeli · Veri Gizleme
Soru 8: private Alana Erişim
BankaHesabi sınıfında private double hesapBakiyesi; var. Başka bir sınıfın main metodunda şu satırlar yazıldı. Ne olur?
BankaHesabi hesap = new BankaHesabi();
hesap.hesapBakiyesi = -500;D: private üyeye yalnızca kendi sınıfının içinden erişilir; denetim derleme zamanındadır: error: hesapBakiyesi has private access in BankaHesabi. Değiştirmek için sınıfın doğrulama yapan public metodu (setter) kullanılır.
Hata Bulma · static Üyeler
Soru 9: static Bağlamdan Örnek Üyesi
Program derlenir mi? Derlenmezse hangi satırlar, hangi hatayı verir? İki farklı düzeltme önerin.
public class Sayim { int sayac = 0; void arttir() { sayac++; } public static void main(String[] args) { arttir(); System.out.println(sayac); } }
Cevabı göster
Derlenmez; iki hata:
error: non-static method arttir() cannot be referenced from a static context error: non-static variable sayac cannot be referenced from a static context
main static’tir: bir nesneye bağlı değildir, this’i yoktur. Örnek üyeleri ancak bir nesne üzerinden kullanabilir.
- Nesne oluşturmak:
Sayim n = new Sayim(); n.arttir(); System.out.println(n.sayac);→1 - Üyeleri static yapmak:
static int sayacvestatic void arttir()→1. Sayaç bu kez bütün nesnelerde ortak olur.
Adım Adım Çalıştırma · static Üyeler
Soru 10: static Bilet Sayacı
Her bilet, ortak sayaçtan bir numara alıyor. a.sonNo = 500; satırı neyi değiştirir? Program ne yazar?
Sınıf yüklenirken static alan bir kez oluşur: sonNo = 100. Henüz hiç nesne yok.
İlk nesne: no önce 0’dır. Yapıcı ortak sayacı artırır: 101.
no = sonNo: nesnenin kendi alanına o anki değer kopyalanır.
Yapıcı biter; a birinci bileti gösterir.
İkinci nesne için aynı adımlar: sayaç 102, #2.no = 102. #1.no değişmez.
a.sonNo nesne üzerinden yazılmış ama alan static’tir: derleyici bunu Bilet.sonNo = 500 olarak işler. Nesnenin içinde sonNo yoktur.
Üçüncü bilet 500’den devam eder: sayaç 501, #3.no = 501.
Çıktı: 101 102 501 ve 501 501. b.sonNo da aynı tek alanı okur.
class Bilet { static int sonNo = 100; int no; Bilet() { sonNo++; no = sonNo; } } public class TrBilet { public static void main(String[] args) { Bilet a = new Bilet(); Bilet b = new Bilet(); a.sonNo = 500; Bilet c = new Bilet(); System.out.println(a.no + " " + b.no + " " + c.no); System.out.println(Bilet.sonNo + " " + b.sonNo); } }
Çoktan Seçmeli · Referanslar ve this
Soru 11: Hangi i?
Program ne yazar? (Her sayı ayrı satırda.)
public class Ornek5 { private static int i = 1; public static void main(String[] args) { System.out.println(i); int i = 2; Ornek5 ornek = new Ornek5(); System.out.println(i); ornek.yazdir(); } public static void yazdir() { System.out.println(i); } }
D: İlk println’da henüz yerel i yoktur; static alan okunur: 1. Yerel i = 2 tanımlandıktan sonra main’de alanı gölgeler: 2. yazdir’ın çerçevesinde yerel i yoktur, main’in yereli görünmez: 1. Alanla aynı adlı yerel değişken yasaldır (C yanlış).
Çıktı Sorusu · Referanslar ve this
Soru 12: Takma Ad
main içinde şu satırlar çalışıyor. Program ne yazar? Kaç Kutu nesnesi oluşur?
class Kutu { int en; Kutu(int en) { this.en = en; } void buyut(int miktar) { en += miktar; } } // main içinde: Kutu a = new Kutu(4); Kutu b = a; b.buyut(3); a = new Kutu(1); a.buyut(2); System.out.println(a.en + " " + b.en); System.out.println(a == b);
Cevabı göster
3 7 false
b = anesneyi kopyalamaz, referansı kopyalar: iki değişken aynı nesneyi gösterir.b.buyut(3)o nesneyi 4 → 7 yapar.a = new Kutu(1)yalnızcaa’yı ikinci nesneye bağlar; ilk nesnebüzerinden yaşar.a.buyut(2)→ 3.- İki nesne oluştu;
ailebartık farklı nesneleri gösterir:false.
Adım Adım Çalıştırma · Referanslar ve this
Soru 13: Değerle Aktarım
Metot bir referans ve bir int alıyor. Metodun içindeki dört atamadan hangileri main’e yansır? Program ne yazar?
Bir Nokta nesnesi oluşur; n yalnızca onun referansını tutar.
n.x = 1 nesneye, s = 1 yığındaki ilkel değişkene yazılır.
Java her zaman değerle aktarır: p referansın kopyası (aynı nesneyi gösterir), k sayının kopyasıdır.
p.x = 5 ortak nesneyi değiştirir; bu değişiklik n üzerinden de görünecek.
k = 7 yalnızca kopyayı değiştirir; main’deki s 1 kalır.
p = new Nokta() kopya referansı yeni nesneye çevirir; n hâlâ #1’i gösterir.
9 yeni nesneye yazılır; #1 etkilenmez.
Metot biter, çerçevesi silinir; #2’yi gösteren referans kalmaz (çöp toplayıcıya kalır). Çıktı: 5 1.
class Nokta { int x; } public class TrAktarim { static void tasi(Nokta p, int k) { p.x = 5; k = 7; p = new Nokta(); p.x = 9; } public static void main(String[] args) { Nokta n = new Nokta(); n.x = 1; int s = 1; tasi(n, s); System.out.println(n.x + " " + s); } }
Çoktan Seçmeli · Metot Aşırı Yükleme
Soru 14: Yalnız Dönüş Tipi mi?
Üç aşırı yüklenmiş metodu olan sınıfta yaz(5L); çağrısı ne yazar?
static void yaz(int x) { System.out.println("int " + x); } static void yaz(double x) { System.out.println("double " + x); } static void yaz(Object o) { System.out.println("Object " + o); }
A: Tam eşleşme (long) yok. Derleyici önce kutulamasız seçenekleri dener: long → double genişletmesi mümkündür, long → int daraltma olduğu için olmaz. Object sürümü kutulama (Long) gerektirdiğinden ancak sonraki aşamada aranır. Yalnızca dönüş tipi farklı iki metot ise hiç yazılamaz: method ... is already defined.
Çıktı Sorusu · Nesneleri Karşılaştırma
Soru 15: == mi, equals mı?
Para sınıfı equals metodunu geçersiz kılmıyor. Program ne yazar?
class Para { int tl; Para(int tl) { this.tl = tl; } } // main içinde: String a = "ab"; String b = new String("ab"); Para p = new Para(5); Para q = new Para(5); Para r = p; System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(p.equals(q)); System.out.println(p.equals(r)); System.out.println(p.tl == q.tl);
Cevabı göster
false true false true true
new String("ab")ayrı bir nesnedir:==referansları karşılaştırır →false;String.equalsiçeriği karşılaştırır →true.Para’daequalsyazılmadığı içinObject’in sürümü çalışır; o da==gibidir:p.equals(q)→false,p.equals(r)→true(aynı nesne).p.tl == q.tlikiint’i karşılaştırır →true.
Çoktan Seçmeli · Wrapper Sınıflar
Soru 16: Integer Önbelleği
Program ilk satırda ne yazar?
Integer a = 100, b = 100;
Integer c = 200, d = 200;
System.out.println((a == b) + " " + (c == d));
System.out.println(c.equals(d));
int e = 200;
System.out.println(c == e);B: Integer a = 100 otomatik kutulamada Integer.valueOf kullanılır; −128…127 arasındaki değerler önbellekten aynı nesne olarak gelir: a == b → true. 200 için iki ayrı nesne oluşur: false. İçerik için c.equals(d) kullanılır (true); c == e gibi bir int ile karşılaştırmada ise kutu açılır ve sonuç true olur.
Çıktı Sorusu · Kayıt ve enum
Soru 17: enum Değerleri
Program ne yazar? Mevsim.valueOf("Kis") çağrılsaydı ne olurdu?
enum Mevsim { ILKBAHAR, YAZ, SONBAHAR, KIS } // main içinde: Mevsim m = Mevsim.valueOf("SONBAHAR"); Mevsim[] t = Mevsim.values(); System.out.println(m.ordinal() + " " + t.length); System.out.println(m == Mevsim.SONBAHAR); System.out.println(t[1]); for (Mevsim x : t) { if (x.ordinal() % 2 == 1) System.out.print(x + " "); } System.out.println();
Cevabı göster
2 4 true YAZ YAZ KIS
ordinal()0’dan başlar:SONBAHAR→ 2;values()dört öğeli bir dizi döndürür.- Her enum değeri tek bir nesnedir;
==ile karşılaştırmak güvenlidir. - Sıra numarası tek olanlar: 1 (
YAZ) ve 3 (KIS). valueOfadı birebir arar (büyük/küçük harf dahil):"Kis"için çalışma zamanındaIllegalArgumentException: No enum constant Mevsim.Kis.
Çıktı Sorusu · İç Sınıflar
Soru 18: Üç Tane x
Üye iç sınıf Ic, dış sınıfın private alanına erişiyor. Program ne yazar?
public class Dis { private int x = 10; class Ic { int x = 20; void yaz(int x) { System.out.println(x + " " + this.x + " " + Dis.this.x); } } static int x() { return 5; } public static void main(String[] args) { Dis d = new Dis(); Dis.Ic i = d.new Ic(); i.yaz(30); d.x = 15; i.yaz(x()); } }
Cevabı göster
30 20 10 5 20 15
- Yalın
xen yakın tanımdır: parametre.this.xiç sınıf nesnesinin alanı,Dis.this.xbağlı olduğu dış nesnenin alanıdır. d.new Ic(): üye iç sınıf nesnesi bir dış nesneye bağlı oluşur;d.x = 15sonrasında iç nesne aynı dış nesneyi görür.- İkinci çağrıda argüman
x()staticmetodunun döndürdüğü 5’tir.
Çoktan Seçmeli · Sınıf Türleri ve Tasarım
Soru 19: Singleton
Yapıcısı private olan Ayarlar sınıfının tek nesnesi getir() ile alınıyor. Program ne yazar?
class Ayarlar { private static final Ayarlar TEK = new Ayarlar(); private int dil = 1; private Ayarlar() { } static Ayarlar getir() { return TEK; } void setDil(int d) { dil = d; } int getDil() { return dil; } } // main içinde: Ayarlar a = Ayarlar.getir(); Ayarlar b = Ayarlar.getir(); a.setDil(2); System.out.println(b.getDil() + " " + (a == b));
C: getir() her çağrıda aynı static final nesneyi döndürür; a ve b aynı nesnenin iki referansıdır. a.setDil(2) ortak nesneyi değiştirir: b.getDil() → 2, a == b → true. Başka sınıftan new Ayarlar() yazmak derlenmez: Ayarlar() has private access in Ayarlar.