Bölüm 4: Sarmalama
Ç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.nulliçin ilk koşul doğru olduğundan||ikinciye bakmaz;NullPointerExceptionoluşmaz.- İki başarılı ekleme:
getSayi()→ 2. Boşlukları da reddetmek içinveri.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
getDakikaadlı 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?
Nesne oluşur; private alan not varsayılan değer 0 ile başlar.
Parametre not alanı gölgeler; koşulda not parametredir: −5 ≥ 0 yanlış.
Atama satırı atlanır; geçersiz değer nesneye giremez. Alan 0 kalır.
40 aralıkta: this.not = not soldaki alanı, sağdaki parametreyle doldurur.
130 > 100: koşul yanlış, alan 40’ta kalır.
getNot() alanın değerini döndürür: 40.
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?
İki bağımsız nesne; her birinin kendi bakiye alanı var.
h1.transfer(h2, 120.0): this = #1, hedef = #2.
cek(m) aynı nesnede çağrılır (this.cek): 120 ≤ 300, bakiye 180.0; true döner.
hedef.yatir(m): bu kez this = #2. Bakiye 50 + 120 = 170.0.
h2.transfer(h1, 400.0): 400 > 170, cek false döner; yatir hiç çağrılmaz.
h2.cek(-20.0): ön koşul (m > 0) bozuk, false. Negatif çekim bakiyeyi artıramaz.
Çı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?
Saat iki alan yerine tek bir alanla tutuluyor: gece yarısından beri geçen saniye.
getDakika() 0 döndürür; fark = 5 − 0 = 5 dakika → +300 saniye.
getSaniye() = 300 % 60 = 0; 30 − 0 eklenir: 330.
getDakika(): 330 / 60 = 5, 5 % 60 = 5.
fark = 2 − 5 = −3 → toplamSaniye 330 − 180 = 150. Saniye kısmı (30) korunur.
75 aralık dışında: koşul yanlış, alan değişmez.
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.longvefloatint’e daralamaz,double’a genişler.StringyalnızcaObject’e uyar.Integerbir nesnedir: kutu açmaya gerek kalmadanObject’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");