Bölüm 4: Sarmalama

Bölüm 4: Sarmalama · Çalışma Soruları
Bilgi saklamaÖn ve son koşullarErişim belirleyicilerGetter ve setterBanka hesabıGerçekleştirmeyi değiştirmekPaketler ve importAd çakışmaları
Sercan KÜLCÜ

Çoktan Seçmeli · Sarmalama ve Bilgi Saklama

Soru 1: Sarmalamanın Özü

Sarmalamayı (encapsulation) en iyi anlatan ifade hangisidir?

B: Sarmalama, alanları (genellikle private) ve onları işleyen metotları aynı birimde toplar; dışarıdan yalnızca sınıfın sunduğu metotlar kullanılır. A kalıtımı, C aşırı yüklemeyi anlatır; D veriyi korumaz, herkese açar.

Çoktan Seçmeli · Sarmalama ve Bilgi Saklama

Soru 2: Neyi Değiştirmek Güvenli?

DijitalSaat sınıfını başka sınıflar yalnızca getDakika(), setDakika(int) gibi public metotlarla kullanıyor. Hangi değişiklik onları kullanan kodu bozmaz?

D: Gizli alanlar gerçekleştirmenin parçasıdır; metotların imzası aynı kaldıkça kullanan kod değişmez. A, B ve C sınıfın arayüzünü (dış yüzünü) değiştirir: o metotları çağıran her satır derleme hatası verir.

Çoktan Seçmeli · Ön ve Son Koşullar

Soru 3: Sözleşmede Sorumluluk

double karekok(double x) metodunun yorumunda “Ön koşul: x ≥ 0. Son koşul: sonucun karesi x’e eşittir.” yazıyor. Hangisi doğrudur?

A: Ön koşul çağrıdan önce doğru olduğu varsayılan durumdur ve onu sağlamak çağıranın sorumluluğudur; ön koşul sağlandığında son koşulu garanti etmek metodun sorumluluğudur. Ön koşul bozulursa metot hiçbir şey garanti etmez (C); D ön koşulun tanımıdır.

Çıktı Sorusu · Ön ve Son Koşullar

Soru 4: Kayıt Sözleşmesi

ekle metodunun ön koşulu: “veri null ve boş değil”. Program ne yazar?

class Kayit {
  private int sayi = 0;
  public boolean ekle(String veri) {
    if (veri == null || veri.isEmpty()) {
      return false;
    }
    sayi++;
    return true;
  }
  public int getSayi() { return sayi; }
}
// main içinde:
Kayit k = new Kayit();
System.out.println(k.ekle("Ali") + " " + k.ekle("")
    + " " + k.ekle(" ") + " " + k.ekle(null));
System.out.println(k.getSayi());
Cevabı göster
true false true false
2
  • "" boştur (isEmpty() → true), reddedilir.
  • " " bir boşluk karakteri içerir: uzunluğu 1, isEmpty() → false; kontrolden geçer ve sayılır.
  • null için ilk koşul doğru olduğundan || ikinciye bakmaz; NullPointerException oluşmaz.
  • İki başarılı ekleme: getSayi() → 2. Boşlukları da reddetmek için veri.trim().isEmpty() kullanılabilir.

Çoktan Seçmeli · Erişim Belirleyiciler

Soru 5: Erişim Düzeyleri

Erişim belirleyicileri için hangisi doğrudur?

C: Üst düzey sınıf private ya da protected olamaz. private yalnızca sınıfın kendisine açıktır (A); belirleyici yazılmazsa paket erişimi geçerlidir (B); protected sınıf, aynı paket ve alt sınıflarla sınırlıdır (D).

Hata Bulma · Erişim Belirleyiciler

Soru 6: Hangi Satırlar Derlenmez?

Saat sınıfında private int dakika;, public int getDakika() ve 0–59 dışını reddeden public void setDakika(int) var. Başka bir sınıftaki A–E satırlarından hangileri derleme hatası verir? Hatalı satırlar silinirse s.getDakika() kaç olur?

Saat s = new Saat();
s.setDakika(30);                 // A
s.dakika = 15;                   // B
int d = s.getDakika;             // C
s.setDakika(s.getDakika() + 5);  // D
String t = s.getDakika();        // E
Cevabı göster
  • B: dakika has private access in Saat.
  • C: parantez yok; derleyici getDakika adlı bir alan arar: cannot find symbol … variable getDakika.
  • E: incompatible types: int cannot be converted to String.
  • A ve D doğrudur. Yalnızca A ve D kalırsa dakika 30 → 35 olur: 35.

Adım Adım Çalıştırma · Getter ve Setter

Soru 7: Setter Koruması

Üç setNot çağrısından hangileri alanı değiştirir? Program ne yazar?

YığınHeapmain()o#1 Ogrencinot0

Nesne oluşur; private alan not varsayılan değer 0 ile başlar.

YığınHeapsetNot(int not)thisnot-5main()o#1 Ogrencinot0

Parametre not alanı gölgeler; koşulda not parametredir: −5 ≥ 0 yanlış.

YığınHeapmain()o#1 Ogrencinot0

Atama satırı atlanır; geçersiz değer nesneye giremez. Alan 0 kalır.

YığınHeapsetNot(int not)thisnot40main()o#1 Ogrencinot40

40 aralıkta: this.not = not soldaki alanı, sağdaki parametreyle doldurur.

YığınHeapsetNot(int not)thisnot130main()o#1 Ogrencinot40

130 > 100: koşul yanlış, alan 40’ta kalır.

YığınHeapgetNot()thismain()o#1 Ogrencinot40

getNot() alanın değerini döndürür: 40.

YığınHeapmain()o#1 Ogrencinot40

gectiMi(): 40 ≥ 50 yanlış. Çıktı: 40 false.

class Ogrenci {
  private int not;
  public void setNot(int not) {
    if (not >= 0 && not <= 100) {
      this.not = not;
    }
  }
  public int getNot() { return not; }
  public boolean gectiMi() { return not >= 50; }
}
// main içinde:
Ogrenci o = new Ogrenci();
o.setNot(-5);
o.setNot(40);
o.setNot(130);
System.out.println(o.getNot() + " " + o.gectiMi());

Çoktan Seçmeli · Getter ve Setter

Soru 8: this Unutulursa

Kutu k = new Kutu(); k.setEn(5); System.out.println(k.getEn()); ne yazar?

class Kutu {
  private int en;
  public int getEn() { return en; }
  public void setEn(int en) { en = en; }
}

B: Metotta en adı parametreyi gösterir; parametre alanı gölgeler. en = en; parametreyi kendine atar, alan varsayılan 0 değerinde kalır. Derleyici hata vermez (C yanlış); doğrusu this.en = en;.

Adım Adım Çalıştırma · Örnek: Banka Hesabı

Soru 9: İki Hesap Arasında Transfer

Hangi çağrılar bakiyeyi değiştirir, hangileri reddedilir? Program ne yazar?

YığınHeapmain()h1h2#1 Hesapbakiye300.0#2 Hesapbakiye50.0

İki bağımsız nesne; her birinin kendi bakiye alanı var.

YığınHeaptransferthishedefm120.0main()h1h2#1 Hesapbakiye300.0#2 Hesapbakiye50.0

h1.transfer(h2, 120.0): this = #1, hedef = #2.

YığınHeapcekthism120.0transferthishedefm120.0main()h1h2#1 Hesapbakiye180.0#2 Hesapbakiye50.0

cek(m) aynı nesnede çağrılır (this.cek): 120 ≤ 300, bakiye 180.0; true döner.

YığınHeapyatirthism120.0transferthishedefm120.0main()h1h2#1 Hesapbakiye180.0#2 Hesapbakiye170.0

hedef.yatir(m): bu kez this = #2. Bakiye 50 + 120 = 170.0.

YığınHeapcekthism400.0transferthishedefm400.0main()h1h2#1 Hesapbakiye180.0#2 Hesapbakiye170.0

h2.transfer(h1, 400.0): 400 > 170, cek false döner; yatir hiç çağrılmaz.

YığınHeapcekthism-20.0main()h1h2#1 Hesapbakiye180.0#2 Hesapbakiye170.0

h2.cek(-20.0): ön koşul (m > 0) bozuk, false. Negatif çekim bakiyeyi artıramaz.

YığınHeapmain()h1h2#1 Hesapbakiye180.0#2 Hesapbakiye170.0

Çıktı: 180.0 170.0. Toplam para korundu: 300 + 50 = 180 + 170.

class Hesap {
  private double bakiye;
  Hesap(double b) { bakiye = b; }
  double getBakiye() { return bakiye; }
  void yatir(double m) { if (m > 0) bakiye += m; }
  boolean cek(double m) {
    if (m <= 0 || m > bakiye) return false;
    bakiye -= m;
    return true;
  }
  void transfer(Hesap hedef, double m) {
    if (cek(m)) hedef.yatir(m);
  }
}
// main içinde:
Hesap h1 = new Hesap(300.0);
Hesap h2 = new Hesap(50.0);
h1.transfer(h2, 120.0);
h2.transfer(h1, 400.0);
h2.cek(-20.0);
System.out.println(h1.getBakiye() + " " + h2.getBakiye());

Kod Yazma · Örnek: Banka Hesabı

Soru 10: İndirimli Ürün

Urun sınıfını yazın: private ad ve fiyat; yapıcı; getFiyat(); yalnızca pozitif fiyatı kabul eden setFiyat(double); ön koşulu 0 < yüzde ≤ 50 olan, uygulandıysa true döndüren indirimUygula(int yuzde). new Urun("Defter", 80.0) için indirimUygula(25), indirimUygula(70) ve setFiyat(-10) sonrasında fiyat ne olur?

Cevabı göster
class Urun {
  private String ad;
  private double fiyat;
  public Urun(String ad, double fiyat) {
    this.ad = ad;
    setFiyat(fiyat);
  }
  public double getFiyat() { return fiyat; }
  public void setFiyat(double fiyat) {
    if (fiyat > 0) this.fiyat = fiyat;
  }
  public boolean indirimUygula(int yuzde) {
    if (yuzde <= 0 || yuzde > 50) return false;
    fiyat = fiyat * (100 - yuzde) / 100;
    return true;
  }
}

true 60.0, ardından false 60.0 (70 reddedilir), setFiyat(-10) sonrası yine 60.0. Yapıcı da setFiyat’ı çağırdığı için kural tek yerde kalır.

Adım Adım Çalıştırma · Sınıf Tasarımı

Soru 11: Tek Alanlı Saat

Saat, dakika ve saniyeyi tek bir alanda tutuyor. Her çağrıdan sonra toplamSaniye kaçtır? Program ne yazar?

YığınHeapmain()s#1 DijitalSaattoplamSaniye0

Saat iki alan yerine tek bir alanla tutuluyor: gece yarısından beri geçen saniye.

YığınHeapsetDakika(5)thisfark5main()s#1 DijitalSaattoplamSaniye300

getDakika() 0 döndürür; fark = 5 − 0 = 5 dakika → +300 saniye.

YığınHeapsetSaniye(30)thissaniye30main()s#1 DijitalSaattoplamSaniye330

getSaniye() = 300 % 60 = 0; 30 − 0 eklenir: 330.

YığınHeapgetDakika()thissetDakika(2)thisfark?main()s#1 DijitalSaattoplamSaniye330

getDakika(): 330 / 60 = 5, 5 % 60 = 5.

YığınHeapsetDakika(2)thisfark-3main()s#1 DijitalSaattoplamSaniye150

fark = 2 − 5 = −3 → toplamSaniye 330 − 180 = 150. Saniye kısmı (30) korunur.

YığınHeapsetSaniye(75)thissaniye75main()s#1 DijitalSaattoplamSaniye150

75 aralık dışında: koşul yanlış, alan değişmez.

YığınHeapmain()s#1 DijitalSaattoplamSaniye150

150 / 60 % 60 = 2 ve 150 % 60 = 30. Çıktı: 2:30. Kullanan kod, iç yapının değiştiğini hiç bilmez.

class DijitalSaat {
  private int toplamSaniye = 0;
  int getDakika() { return toplamSaniye / 60 % 60; }
  int getSaniye() { return toplamSaniye % 60; }
  void setDakika(int dakika) {
    if (dakika < 0 || dakika > 59) return;
    int fark = dakika - getDakika();
    toplamSaniye += fark * 60;
  }
  void setSaniye(int saniye) {
    if (saniye >= 0 && saniye < 60)
      toplamSaniye += saniye - getSaniye();
  }
}
// main içinde:
DijitalSaat s = new DijitalSaat();
s.setDakika(5); s.setSaniye(30);
s.setDakika(2); s.setSaniye(75);
System.out.println(s.getDakika() + ":" + s.getSaniye());

Çoktan Seçmeli · Sınıf Tasarımı

Soru 12: Arayüzü Gerçekleştirmek

Bu kod derlenir mi?

interface Araba {
  void hareketEt();
  void dur();
}
class SporAraba implements Araba {
  public void hareketEt() {
    System.out.println("gidiyor");
  }
}

A: Derleyici SporAraba is not abstract and does not override abstract method dur() in Araba der. implements Araba diyen sınıf arayüzdeki her soyut metodu gerçekleştirmek zorundadır (ya da kendisi abstract olmalıdır). Arayüzde public yazmak gerekmez; metotlar örtük olarak public abstract’tır (D yanlış).

Çoktan Seçmeli · Paketler

Soru 13: Paketli Programı Çalıştırmak

src/uygulama/Ana.java dosyası package uygulama; ile başlıyor ve main içeriyor. Proje klasöründe javac -d out src/banka/Hesap.java src/uygulama/Ana.java ile derlendi. Hangi komut programı çalıştırır?

D: -d out sınıfları paket klasörleriyle out/ altına yazar; çalıştırırken sınıf yolu out verilir ve sınıfın tam adı (paket + sınıf, noktayla) yazılır. B’de paket adı eksik; A ve C dosya yolu verir, sınıf adı değil.

Hata Bulma · Paketler

Soru 14: Paket Dışından Erişim

İki dosya birlikte derleniyor. Hangi hatalar çıkar? Programın Ece yazması için en az hangi değişiklikler gerekir?

// src/okul/Ogrenci.java
package okul;
class Ogrenci {
  private String ad;
  public Ogrenci(String ad) { this.ad = ad; }
  String getAd() { return ad; }
}
// src/uygulama/Ana.java
package uygulama;
import okul.Ogrenci;
public class Ana {
  public static void main(String[] args) {
    Ogrenci o = new Ogrenci("Ece");
    System.out.println(o.getAd());
  }
}
Cevabı göster
error: Ogrenci is not public in okul;
  cannot be accessed from outside package

Belirleyicisi olmayan sınıf paket erişimlidir; uygulama paketinden görülemez (import satırında ve kullanıldığı her yerde aynı hata).

Sınıf public yapılınca ikinci hata görünür: getAd() is not public in Ogrenci; cannot be accessed from outside package. Yöntem de paket erişimlidir.

Gerekenler: public class Ogrenci ve public String getAd(). Yapıcı zaten public.

Çoktan Seçmeli · Paketler

Soru 15: import Gerekmeyen Sınıf

Bir sınıfta import satırı yok ve tam ad kullanılmıyor. Aşağıdakilerden hangisi kısa adıyla kullanılabilir?

C: java.lang paketi (String, Math, System, Integer…) her dosyaya otomatik görünür. Scanner, ArrayList ve Random java.util’dedir; import ya da tam ad (java.util.Random) gerekir.

Çıktı Sorusu · Ad Çakışmaları

Soru 16: Hangi yaz?

Üç aşırı yüklenmiş yaz metodu var. main’deki beş çağrı 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);
}
// main içinde:
yaz('B');
yaz(7L);
yaz(2.5f);
yaz("7");
yaz(Integer.valueOf(7));
Cevabı göster
int 66
double 7.0
double 2.5
Object 7
Object 7
  • 'B' (char) int’e genişler: kodu 66.
  • long ve float int’e daralamaz, double’a genişler.
  • String yalnızca Object’e uyar.
  • Integer bir nesnedir: kutu açmaya gerek kalmadan Object’e uyduğu için önce o seçilir (kutu açma ancak sonraki aşamada denenir).

Hata Bulma · Ad Çakışmaları

Soru 17: İki Date

Program derlenir mi? Derlenmiyorsa hata nedir? java.util.Date’i kısa adla, java.sql.Date’i de kullanacak biçimde nasıl düzeltilir?

import java.util.*;
import java.sql.*;
public class Tarih {
  public static void main(String[] args) {
    List<String> l = new ArrayList<>();
    Date tarih = null;
  }
}
Cevabı göster
error: reference to Date is 
  ambiguous: both class
  java.sql.Date in java.sql and
  class java.util.Date in
  java.util match

İki * içe aktarması aynı adlı iki sınıf getirir; List ve ArrayList sorun değildir, yalnızca Date belirsizdir.

Düzeltme: import java.util.Date; ekleyin (tek sınıflık import, *’a üstün gelir); öteki için tam ad yazın: java.sql.Date kayit = java.sql.Date.valueOf("2025-03-01");

Son

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