Bölüm 4: Nesne ve Sınıflar

Bölüm 4: Nesne ve Sınıflar · Çalışma Soruları
Sınıf ve nesneYapıcı zinciriİlklendiricilerstatic üyelerDeğerle aktarımReferanslar ve thisAşırı yükleme== ve equalsWrapperenumİç sınıflar
Sercan KÜLCÜ

Ç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() önce this(2), o da this(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 (parametre en = 2), sonra A8 (alan en = 8).
  • new Kutu(1): this(1, 3) → C4, ardından B1. 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?

YığınHeapTrRenk()thismain()e?#1 TrRenkrenknullkat0

new heap’te nesneyi ayırır; alanlar varsayılan değer alır: renk = null, kat = 0. Parametresiz yapıcı başlar.

YığınHeapTrRenk(String)thisrenk"beyaz"TrRenk()thismain()e?#1 TrRenkrenknullkat0

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.

YığınHeapTrRenk(String)thisrenk"beyaz"TrRenk()thismain()e?#1 TrRenkrenk"beyaz"kat0

this.renk nesnenin alanı, sağdaki renk parametredir: alan "beyaz" olur.

YığınHeapTrRenk(String)thisrenk"beyaz"TrRenk()thismain()e?#1 TrRenkrenk"beyaz"kat1

Parametreli yapıcı kat’ı 1 yapar ve biter; çerçevesi kapanır.

YığınHeapTrRenk()thismain()e?#1 TrRenkrenk"beyaz"kat2

Parametresiz yapıcı kaldığı yerden sürer: kat = 2. Son yazan kazanır; 1 değeri ezildi.

YığınHeapmain()e#1 TrRenkrenk"beyaz"kat2

İki yapıcı da bitti; new ifadesinin değeri olan referans e’ye atanır.

YığınHeapmain()ef#1 TrRenkrenk"beyaz"kat2#2 TrRenkrenk"mavi"kat1

İkinci nesne doğrudan TrRenk(String) ile kurulur: "mavi" ve 1. Parametresiz yapıcı bu kez hiç çalışmaz.

YığınHeapmain()ef#1 TrRenkrenk"beyaz"kat2#2 TrRenkrenk"mavi"kat1

Çı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 önce M yazar; B sınıfı ilk new B()’de yüklenir ve static blok 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 static blok 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 sayac ve static 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 alanı: Bilet (static)sonNo100YığınHeapmain()a?b?c?

Sınıf yüklenirken static alan bir kez oluşur: sonNo = 100. Henüz hiç nesne yok.

Sınıf alanı: Bilet (static)sonNo101YığınHeapBilet()thismain()a?b?c?#1 Biletno0

İlk nesne: no önce 0’dır. Yapıcı ortak sayacı artırır: 101.

Sınıf alanı: Bilet (static)sonNo101YığınHeapBilet()thismain()a?b?c?#1 Biletno101

no = sonNo: nesnenin kendi alanına o anki değer kopyalanır.

Sınıf alanı: Bilet (static)sonNo101YığınHeapmain()ab?c?#1 Biletno101

Yapıcı biter; a birinci bileti gösterir.

Sınıf alanı: Bilet (static)sonNo102YığınHeapmain()abc?#1 Biletno101#2 Biletno102

İkinci nesne için aynı adımlar: sayaç 102, #2.no = 102. #1.no değişmez.

Sınıf alanı: Bilet (static)sonNo500YığınHeapmain()abc?#1 Biletno101#2 Biletno102

a.sonNo nesne üzerinden yazılmış ama alan static’tir: derleyici bunu Bilet.sonNo = 500 olarak işler. Nesnenin içinde sonNo yoktur.

Sınıf alanı: Bilet (static)sonNo501YığınHeapBilet()thismain()abc?#1 Biletno101#2 Biletno102#3 Biletno501

Üçüncü bilet 500’den devam eder: sayaç 501, #3.no = 501.

Sınıf alanı: Bilet (static)sonNo501YığınHeapmain()abc#1 Biletno101#2 Biletno102#3 Biletno501

Çı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 = a nesneyi kopyalamaz, referansı kopyalar: iki değişken aynı nesneyi gösterir. b.buyut(3) o nesneyi 4 → 7 yapar.
  • a = new Kutu(1) yalnızca a’yı ikinci nesneye bağlar; ilk nesne b üzerinden yaşar. a.buyut(2) → 3.
  • İki nesne oluştu; a ile b artı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?

YığınHeapmain()ns?#1 Noktax0

Bir Nokta nesnesi oluşur; n yalnızca onun referansını tutar.

YığınHeapmain()ns1#1 Noktax1

n.x = 1 nesneye, s = 1 yığındaki ilkel değişkene yazılır.

YığınHeaptasi(p, k)pk1main()ns1#1 Noktax1

Java her zaman değerle aktarır: p referansın kopyası (aynı nesneyi gösterir), k sayının kopyasıdır.

YığınHeaptasi(p, k)pk1main()ns1#1 Noktax5

p.x = 5 ortak nesneyi değiştirir; bu değişiklik n üzerinden de görünecek.

YığınHeaptasi(p, k)pk7main()ns1#1 Noktax5

k = 7 yalnızca kopyayı değiştirir; main’deki s 1 kalır.

YığınHeaptasi(p, k)pk7main()ns1#1 Noktax5#2 Noktax0

p = new Nokta() kopya referansı yeni nesneye çevirir; n hâlâ #1’i gösterir.

YığınHeaptasi(p, k)pk7main()ns1#1 Noktax5#2 Noktax9

9 yeni nesneye yazılır; #1 etkilenmez.

YığınHeapmain()ns1#1 Noktax5#2 Noktax9

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.equals içeriği karşılaştırır → true.
  • Para’da equals yazılmadığı için Object’in sürümü çalışır; o da == gibidir: p.equals(q) → false, p.equals(r) → true (aynı nesne).
  • p.tl == q.tl iki int’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).
  • valueOf adı birebir arar (büyük/küçük harf dahil): "Kis" için çalışma zamanında IllegalArgumentException: 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 x en yakın tanımdır: parametre. this.x iç sınıf nesnesinin alanı, Dis.this.x bağ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 = 15 sonrasında iç nesne aynı dış nesneyi görür.
  • İkinci çağrıda argüman x() static metodunun 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.

Son

Bölüm 4: Nesne ve Sınıflar: Çalışma Soruları
Konu anlatımı: nesne ve sınıflar sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.