SEN1002 · 10. hafta · Midterm Review

Vize tekrar: 1-9. haftalar karışık

Sınıflardan istisnalara kadar vizeye giren her konunun tek sayfalık özeti ve konuları birbirine karıştıran 12 sınav tipi soru.

constructor chainingdynamic bindingabstract classinterfaceupcastingdowncastingoverloadingoverridingStringBuilderregexchecked exceptionfinallystack unwinding

Bu sayfa vizeye girmeden önce son tur. İlk dokuz haftanın her biri ayrı ayrı sorulabilir ama vize soruları çoğu zaman iki üç konuyu tek kodda birleştirir: constructor zinciri içinde polimorfik çağrı, abstract sınıfta arayüz metodu, override edilmiş metodun içinde try/finally. Aşağıdaki tablo her haftanın “bilmezsen puan kaybedersin” kurallarını topluyor. Sonra 12 karışık soru var; her sorunun açıklamasında hangi haftaya ait olduğu yazıyor. Takıldığın soruda o haftanın sayfasına dön.

Çalışma önerisi: soruları kağıt üzerinde çöz, cevabı yazmadan açma. “What is printed?” sorularında her satırı tek tek izle, değişkenlerin değerlerini yanına yaz. Derleme hatası sorularında önce “derleyici bunu biliyor mu” diye sor: derleyici sadece tiplere bakar, nesneleri görmez.

Haftalık özet tablo

HaftaKonuBilmen gerekenKlasik tuzak
1Sınıflar ve nesnelerConstructor, this, kapsülleme, static ve instance, toString, equalsname = name; alanı doldurmaz; constructor yazınca default constructor gider
2Kalıtımextends, super(...), constructor zinciri, overriding ve overloading, ObjectÜstte parametresiz constructor yoksa gizli super() derlenmez
3Çok biçimlilikStatic tip ve dynamic tip, upcasting, downcasting, instanceofDeğişkenin tipinde olmayan metot çağrılamaz; yanlış cast ClassCastException
4Abstract ve interfaceabstract metot, implements, default metot, ComparableInterface metodunu public’siz yazmak
5GUI bileşenleriJFrame, JLabel, JTextField, JButton, FlowLayout, BorderLayout, GridLayoutBorderLayout’ta ikinci add öncekini ezer; getText() String
6OlaylarActionListener, getSource, iç sınıf, anonim sınıf, lambdaLambda içinde yerel değişkeni değiştirmek
7UMLGörünürlük işaretleri, ilişki okları, çokluk, aggregation ve compositionÜçgen üst sınıfa bakar; elmas bütün tarafında
8String ve regexsubstring, indexOf, char aritmetiği, StringBuilder, split, matchess.toUpperCase(); atanmazsa hiçbir şey değişmez
9İstisnalartry/catch/finally akışı, checked ve unchecked, throw ve throws, özel istisnaGenel catch’i önce yazmak; finally’nin return’den önce çalışması

Çıktı sorusu çözme yöntemi

Karma sorularda şu sırayı izle:

  1. Nesne yaratılıyorsa constructor zincirini çiz. En üst sınıftan başlayarak gövdeleri sırayla yaz. Alan ilk değerlerinin super() bittikten sonra atandığını unutma.
  2. Her metot çağrısında iki soru sor. Derleyici bu çağrıya izin veriyor mu (değişkenin tipi)? Çalışırken hangi sürüm çalışıyor (nesnenin tipi)?
  3. Overload varsa önce imzayı seç. Argümanların derleme zamanındaki tiplerine bak.
  4. try içinde istisna olursa kalan satırların üstünü çiz. İlk uyan catch’i bul, finally’yi ekle, sonra yakalanmadıysa yukarı çık.
  5. String işlemlerinde indeksleri yaz. substring ve indexOf sorularında karakterlerin altına 0’dan başlayarak numara yaz.
Örnek: new Mid();   (Mid extends Base, Base() içinde show() çağrılıyor)

1. Mid() → super() → Base()
2. Base gövdesi: "Base "  sonra show()
3. show() override edilmiş, nesne Mid → Mid.show()  → tag henüz null  → "M.show(null) "
4. super() bitti → Mid'in alanları atanır: tag = "mid"
5. Mid gövdesi: "Mid "

Derleme hatası mı, çalışma hatası mı?

Vizede “what happens?” sorularında üç cevap var: derlenmez, çalışırken istisna fırlar, ya da normal çalışır. Ayırt etme tablosu:

DurumSonuç
Değişkenin tipinde olmayan metodu çağırmakDerleme hatası
Üst tipten alt tipe cast’siz atamaDerleme hatası
Kardeş sınıflar arası castDerleme hatası
Nesnesi uymayan geçerli castÇalışma zamanı: ClassCastException
Abstract sınıftan newDerleme hatası
Somut sınıf abstract metodu yazmamışDerleme hatası
Checked istisna ne yakalanmış ne bildirilmişDerleme hatası
Dizi ya da String sınırı aşılmışÇalışma zamanı: IndexOutOfBounds
null üzerinde metot çağrısıÇalışma zamanı: NullPointerException
int’i 0’a bölmekÇalışma zamanı: ArithmeticException
Integer.parseInt("abc")Çalışma zamanı: NumberFormatException
Lambda içinde yerel değişkeni değiştirmekDerleme hatası
private alana başka sınıftan erişimDerleme hatası

Son kontrol listesi

  • equals override ederken parametre Object mi? @Override yazdın mı?
  • Alt sınıf constructor’ı super(...) ile doğru constructor’ı çağırıyor mu?
  • Arayüz metotlarını uygularken public yazdın mı?
  • compareTo int dönüyor mu, Double.compare ya da Integer.compare kullandın mı?
  • Catch’ler özelden genele mi sıralı?
  • Kendi istisnan extends Exception (checked) mı extends RuntimeException (unchecked) mı, metot imzası buna uygun mu?
  • String sonucunu bir değişkene atadın mı?

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Alt sınıfın alanları constructor başında hazırsuper() bitene kadar varsayılan değerde
equals(Coin c) equals’ı override ederOverload; Object tipindeki argümanla çağrılınca Object’inki çalışır
Interface default metodu override edilemezEdilir; Final.grade() örneği
p.parse("12") + p.parse("x") önce 12 basarprintln’ın argümanı tamamen hesaplanır, finally çıktıları önce gelir
catch’te return varsa finally atlanırYine çalışır
Yakalanmayan istisnada finally çalışmazÇalışır, sonra istisna yukarı gider
Abstract sınıf interface metodunu yazmak zorundaZorunda değil; somut alt sınıf zorunda

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1orta

What is printed?

class Item {
    static int made = 0;
    int id;
    Item() { this(100); System.out.print("I() "); }
    Item(int id) { this.id = id + made; made++; System.out.print("I(" + this.id + ") "); }
}
// in main:
new Item(); new Item(5);
System.out.println(Item.made);
Cevabı göster
I(100) I() I(6) 2

new Item() → this(100): made henüz 0, id = 100, made 1 olur, I(100) basılır; sonra dış constructor I() basar. new Item(5): id = 5 + 1 = 6, made 2. static sayaç iki nesne boyunca paylaşıldı. (Hafta 1)

Soru 2zor

What is printed by new Mid();?

class Base {
    Base() { System.out.print("Base "); show(); }
    void show() { System.out.print("B.show "); }
}
class Mid extends Base {
    String tag = "mid";
    Mid() { super(); System.out.print("Mid "); }
    @Override void show() { System.out.print("M.show(" + tag + ") "); }
}
Cevabı göster
Base M.show(null) Mid

Önce Base'in constructor'ı çalışır. İçindeki show() override edilmiş: nesne Mid, Mid'in show'u çalışır. Ama Mid'in alan ilk değeri (tag = "mid") super() bittikten sonra atanır; o an tag hâlâ null. Sonra Mid'in gövdesi. (Hafta 2 + 3)

Soru 3orta

What is printed?

interface Scorable {
    int score();
    default String grade() { return score() >= 50 ? "PASS" : "FAIL"; }
}
abstract class Exam implements Scorable {
    protected int raw;
    Exam(int raw) { this.raw = raw; }
    public String toString() { return getClass().getSimpleName() + ":" + score() + ":" + grade(); }
}
class Midterm extends Exam { Midterm(int r) { super(r); } public int score() { return raw * 2; } }
class Final extends Exam {
    Final(int r) { super(r); }
    public int score() { return raw + 10; }
    public String grade() { return score() >= 60 ? "PASS" : "FAIL"; }
}
// in main:
Exam[] exams = { new Midterm(30), new Final(45), new Midterm(20) };
for (Exam e : exams) System.out.println(e);
Cevabı göster
Midterm:60:PASS / Final:55:FAIL / Midterm:40:FAIL

Midterm(30): 60, default grade (50 sınırı): PASS. Final(45): 55, Final grade'i override etmiş (60 sınırı): FAIL. Midterm(20): 40 < 50: FAIL. Exam abstract ve score'u yazmıyor; somut sınıflar yazıyor. (Hafta 3 + 4)

Soru 4orta

Find the compile errors.

interface Scorable { int score(); }
abstract class Exam implements Scorable { }
class Quiz extends Exam { }
// in main:
Exam e = new Quiz();
Scorable s = e;
Quiz q = s;
Cevabı göster
Quiz score() yazmamış; Scorable → Quiz cast'siz atanamaz

Exam abstract olduğu için score()'u yazmak zorunda değil, ama somut Quiz zorunda: Quiz is not abstract and does not override abstract method score() in Scorable. Scorable s = e; geçerli (upcasting). Quiz q = s; aşağı dönüşüm: incompatible types: Scorable cannot be converted to Quiz; (Quiz) s gerekir. (Hafta 3 + 4)

Soru 5orta

What is printed?

static String mystery(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = s.length() - 1; i >= 0; i -= 2) sb.append(s.charAt(i));
    return sb.toString().toUpperCase();
}
// in main:
System.out.println(mystery("polymorph"));
Cevabı göster
HRMLP

"polymorph" 9 karakter, indeksler 0-8. Döngü 8, 6, 4, 2, 0: h, r, m, l, p. Birleşince "hrmlp", büyük harfle HRMLP. (Hafta 8)

Soru 6orta

What is printed?

String s = "a-b--c";
System.out.println(s.split("-").length + " " + s.replaceAll("-+", "+") + " " + s.indexOf("--"));
Cevabı göster
4 a+b+c 3

split: a, b, "" (iki tire arası), c: 4 parça. -+ bir ya da daha çok tire: her grup tek + olur. "--" ilk kez 3. indekste başlar (a0 -1 b2 -3). (Hafta 8)

Soru 7zor

What is printed?

class Parser { int parse(String s) { return Integer.parseInt(s); } }
class SafeParser extends Parser {
    @Override int parse(String s) {
        try { return super.parse(s); }
        catch (NumberFormatException e) { return -1; }
        finally { System.out.print("[done " + s + "] "); }
    }
}
// in main:
Parser p = new SafeParser();
System.out.println(p.parse("12") + p.parse("x"));
Cevabı göster
[done 12] [done x] 11

Dynamic binding: iki çağrı da SafeParser'ın parse'ına gider. "12" → 12, finally basar. "x" → NumberFormatException yakalanır, −1, finally basar. println'ın argümanı ancak iki çağrı bittikten sonra hesaplanır: 12 + (−1) = 11 en son basılır. (Hafta 3 + 9)

Soru 8zor

What is printed?

static int risky(int x) {
    try {
        if (x < 0) throw new IllegalArgumentException("neg");
        return 10 / x;
    } catch (ArithmeticException e) {
        System.out.print("AE ");
        return 0;
    } finally {
        System.out.print("F ");
    }
}
// in main:
System.out.println(risky(5));
System.out.println(risky(0));
try { System.out.println(risky(-1)); }
catch (IllegalArgumentException e) { System.out.println("caught " + e.getMessage()); }
Cevabı göster
F 2 / AE F 0 / F caught neg

risky(5): 10 / 5 = 2, dönmeden önce finally "F ". risky(0): ArithmeticException yakalanır "AE ", 0 dönecek, önce finally "F ". risky(-1): IllegalArgumentException'ı yakalayan catch yok; finally çalışır, istisna main'e çıkar ve oradaki catch yakalar. (Hafta 9)

Soru 9zor

What is printed?

class Coin {
    int value;
    Coin(int v) { value = v; }
    public boolean equals(Coin other) { return value == other.value; }
}
// in main:
Coin c1 = new Coin(5), c2 = new Coin(5);
Object o2 = c2;
System.out.println(c1.equals(c2) + " " + c1.equals(o2));
Cevabı göster
true false

equals(Coin) Object'in equals(Object)'ini override etmiyor, overload ediyor. c1.equals(c2): argüman Coin, derleyici equals(Coin)'i seçer: true. c1.equals(o2): argümanın static tipi Object, equals(Object) seçilir, o da Object'inki (adres): false. @Override yazılsaydı derleyici hatayı yakalardı. (Hafta 1 + 2 + 3)

Soru 10kolay

Which statement is FALSE?

  1. A subclass constructor always calls a superclass constructor first
  2. An interface can contain default methods
  3. A checked exception must be caught or declared
  4. Fields are chosen by the object's runtime type
Cevabı göster
Fields are chosen by the object's runtime type

Alanlar override edilmez; ref.alan değişkenin derleme zamanındaki tipine bakar. Dynamic binding sadece override edilmiş instance metotlar için. Diğer üçü doğru: gizli super(), Java 8+ default metotlar, checked istisna kuralı.

Soru 11kolay

Which layout is the default for a JFrame's content pane, and what happens when you call frame.add(b1); frame.add(b2);?

Cevabı göster
BorderLayout; ikisi de CENTER'a gider, sadece b2 görünür

İçerik paneli BorderLayout ile gelir, konumsuz add CENTER'a koyar ve aynı bölgedeki önceki bileşenin yerini alır. Yan yana görmek için setLayout(new FlowLayout()) ya da bir JPanel kullan. (Hafta 5)

Soru 12zor

Write an abstract class Shape that implements Comparable<Shape> (comparing by area) with an abstract double area(), and two subclasses Rect(w, h) and Circle(r). Sorting {Rect(2,5), Circle(1), Rect(1,1)} must give [Rect(1.0), Circle(3.14), Rect(10.0)].

Cevabı göster
abstract class Shape implements Comparable<Shape> + Double.compare(area(), o.area())

compareTo abstract sınıfta bir kez yazılır, içindeki area() her alt sınıfta farklı çalışır (polimorfizm):

abstract class Shape implements Comparable<Shape> {
    abstract double area();
    public int compareTo(Shape o) {
        return Double.compare(area(), o.area());
    }
}
class Rect extends Shape {
    double w, h;
    Rect(double w, double h) { this.w = w; this.h = h; }
    double area() { return w * h; }
    public String toString() { return "Rect(" + area() + ")"; }
}
class Circle extends Shape {
    double r;
    Circle(double r) { this.r = r; }
    double area() { return Math.PI * r * r; }
    public String toString() { return String.format("Circle(%.2f)", area()); }
}
Alanlar 10.0, 3.14..., 1.0; Arrays.sort artan sırayla dizer: [Rect(1.0), Circle(3.14), Rect(10.0)].

Doğrulama: Tüm sorular JDK 26 ile çalıştırıldı (java verify/SEN1002/W10.java); derleme hatası sorusu javac ile denendi (verify/SEN1002/err/E10a.java). Özet tablodaki kurallar 1-9. hafta sayfalarının doğrulama dosyalarından.

Deftere not kartı

CTOR: this(...) / super(...) ilk satır. Gizli super(). Çıktı tepeden aşağı. Alan ilk değeri super()'dan SONRA. STATIC: tek kopya. static içinden instance alana erişim yok. ==: adres. equals(Object) override et; equals(Coin) overload olur. DERLEYİCİ değişkenin tipine, JVM nesnenin tipine bakar (override edilmiş metotlarda). Alan / static / private: değişkenin tipi. Overload seçimi: argümanın static tipi. Upcast otomatik. Downcast (Alt) şart; yanlışsa ClassCastException. Kardeşler arası: derleme hatası. abstract: new yok; abstract metot → abstract sınıf; somut alt sınıf hepsini yazar. interface: metotlar public; alan public static final; çok implements; default çakışırsa override. GUI: JPanel FlowLayout, JFrame BorderLayout. getText() String. Lambda sadece tek metotlu arayüz. Lambda içinde yerel değişken effectively final. MouseListener → MouseAdapter. UML: + - # ~, altı çizili static, boş üçgen extends, kesikli üçgen implements, dolu elmas composition. String değişmez; substring(a,b) b hariç; 'A'+2=67; split sondaki boşları atar; StringBuilder equals yok. try kalanı atlanır, ilk uyan catch, finally HER ZAMAN; alt sınıf catch önce. Checked (IOException) → catch ya da throws. Unchecked (RuntimeException) → serbest.