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.
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
| Hafta | Konu | Bilmen gereken | Klasik tuzak |
|---|---|---|---|
| 1 | Sınıflar ve nesneler | Constructor, this, kapsülleme, static ve instance, toString, equals | name = name; alanı doldurmaz; constructor yazınca default constructor gider |
| 2 | Kalıtım | extends, super(...), constructor zinciri, overriding ve overloading, Object | Üstte parametresiz constructor yoksa gizli super() derlenmez |
| 3 | Çok biçimlilik | Static tip ve dynamic tip, upcasting, downcasting, instanceof | Değişkenin tipinde olmayan metot çağrılamaz; yanlış cast ClassCastException |
| 4 | Abstract ve interface | abstract metot, implements, default metot, Comparable | Interface metodunu public’siz yazmak |
| 5 | GUI bileşenleri | JFrame, JLabel, JTextField, JButton, FlowLayout, BorderLayout, GridLayout | BorderLayout’ta ikinci add öncekini ezer; getText() String |
| 6 | Olaylar | ActionListener, getSource, iç sınıf, anonim sınıf, lambda | Lambda içinde yerel değişkeni değiştirmek |
| 7 | UML | Gö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 |
| 8 | String ve regex | substring, indexOf, char aritmetiği, StringBuilder, split, matches | s.toUpperCase(); atanmazsa hiçbir şey değişmez |
| 9 | İstisnalar | try/catch/finally akışı, checked ve unchecked, throw ve throws, özel istisna | Genel catch’i önce yazmak; finally’nin return’den önce çalışması |
Çıktı sorusu çözme yöntemi
Karma sorularda şu sırayı izle:
- 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. - 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)?
- Overload varsa önce imzayı seç. Argümanların derleme zamanındaki tiplerine bak.
- 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.
- String işlemlerinde indeksleri yaz.
substringveindexOfsoruları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:
| Durum | Sonuç |
|---|---|
| Değişkenin tipinde olmayan metodu çağırmak | Derleme hatası |
| Üst tipten alt tipe cast’siz atama | Derleme hatası |
| Kardeş sınıflar arası cast | Derleme hatası |
| Nesnesi uymayan geçerli cast | Çalışma zamanı: ClassCastException |
Abstract sınıftan new | Derleme 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ştirmek | Derleme hatası |
| private alana başka sınıftan erişim | Derleme hatası |
Son kontrol listesi
- equals override ederken parametre
Objectmi?@Overrideyazdın mı? - Alt sınıf constructor’ı
super(...)ile doğru constructor’ı çağırıyor mu? - Arayüz metotlarını uygularken
publicyazdın mı? - compareTo int dönüyor mu,
Double.compareya daInteger.comparekullandı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üşünce | Doğrusu |
|---|---|
| Alt sınıfın alanları constructor başında hazır | super() bitene kadar varsayılan değerde |
equals(Coin c) equals’ı override eder | Overload; Object tipindeki argümanla çağrılınca Object’inki çalışır |
| Interface default metodu override edilemez | Edilir; Final.grade() örneği |
p.parse("12") + p.parse("x") önce 12 basar | println’ın argümanı tamamen hesaplanır, finally çıktıları önce gelir |
| catch’te return varsa finally atlanır | Yine çalışır |
| Yakalanmayan istisnada finally çalışmaz | Çalışır, sonra istisna yukarı gider |
| Abstract sınıf interface metodunu yazmak zorunda | Zorunda değil; somut alt sınıf zorunda |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
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
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)
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
Ö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)
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(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)
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
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)
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
"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)
What is printed?
String s = "a-b--c";
System.out.println(s.split("-").length + " " + s.replaceAll("-+", "+") + " " + s.indexOf("--"));Cevabı göster
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)
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
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)
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
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)
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
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)
Which statement is FALSE?
- A subclass constructor always calls a superclass constructor first
- An interface can contain default methods
- A checked exception must be caught or declared
- Fields are chosen by the object's runtime type
Cevabı göster
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ı.
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
İç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)
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
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.