Java'ya Giriş ve İlk Program

Bilgisayar ve Programlamaya Giriş
ProgramAraçlarİlk programDerlemeHatalar
Sercan KÜLCÜ · Giresun Üniversitesi

Giriş

Öğrenme Çıktıları

Program

Programı veri ve işlemler bütünü olarak açıklamak.

Java

Kaynak kod, bytecode ve JVM ilişkisini kurmak.

İlk program

Java dosyasını yazıp derlemek ve çalıştırmak.

Hatalar

Söz dizimi, çalışma zamanı ve mantık hatalarını ayırt etmek.

Temeller

Program Nedir?

Girdi70, 90Program1. notları oku2. topla3. 2'ye böl4. sonucu yazbellek (durum)toplam = 160Çıktı80
  • Bilgisayarın belirli bir görevi yerine getirmesi için yürüttüğü komutlar bütünüdür.
  • Girdi alabilir, veriyi işler, durum saklar (bellekteki değerler) ve çıktı üretir.
  • Davranışı dilin kuralları ve yazılan algoritma belirler.
  • Örnek: iki notun ortalaması → girdi 70, 90; çıktı 80.

Temeller

Programlama Dilinin Yönleri

inttoplam=fiyat * adet;Tip sistemiint × int → intdeğerle yapılabileceklerÇalışma modelibellekte toplam kutusudeğer orada saklanırAnlamçarp, sonucu kutuya yazçalışınca ne olur?Söz dizimideyim ; ile bitergeçerli yazım biçimi
  • Söz dizimi geçerli biçimi, anlam çalıştırıldığında ne olacağını tanımlar.
  • Tip sistemi işlemleri sınırlar; çalışma modeli belleğin ve komutların nasıl yürütüldüğünü belirler.
  • Derleyici söz dizimini ve tipleri çalıştırmadan önce denetler.

Kaynak Kod

Düz Metin Kaynak Dosyası

Merhaba.javapublic class Merhaba {public static void...}düz metin:biçim bilgisi yokher düzenleyiciaçabilirp70u75b62l6Ci69c63ASCII karakterler UTF-8'de 1 bayt (onaltılık); ç, ğ, ş gibi harfler 2 bayt
  • .java dosyası düz metindir; Not Defteri, VS Code veya IDE ile açılabilir.
  • Sürüm kontrol sistemleri satır değişikliklerini izleyebilir.
  • Karakter kodlaması (UTF-8), satır sonu ve dosya adı tutarlı olmalıdır: Türkçe karakterler yanlış kodlamada bozulur.

Kaynak Kod

Programlama Araçları

Düzenleyici

Kaynak kodu yazma.

IDE

Proje, tamamlama, derleme ve hata ayıklama.

javac

Kaynak kodu bytecode'a derleme.

java

Sınıfı JVM üzerinde çalıştırma.

Javadoc

API belgesi üretme.

Sürüm kontrolü

Değişiklik geçmişi.

Araçlar bir Java programının yolculuğundaDüzenleyici / IDEMerhaba.javajavacMerhaba.classjava(JVM)çıktıMerhabajavadoc → HTML API belgesiSürüm kontrolü: v1 → v2 → v3 geçmişi

Java

Java'nın Doğuşu ve Sürümleri

1991Green projesi(ilk adı Oak)1995Java 1.0Sun2006Açık kaynakOpenJDK2010OracleSun'ı aldı2014Java 8LTS2018Java 11 LTS6 aylık takvim2021Java 17LTS2023Java 21LTS2025Java 25LTS
  • James Gosling ve ekibi 1991'de Sun Microsystems'te başladı; dil 1995'te Java adıyla yayımlandı. 2010'dan beri Oracle geliştiriyor, açık kaynak kodu OpenJDK'dadır.
  • Tasarım hedefi bir kez yaz, her yerde çalıştır: aynı bytecode her platformun JVM'sinde çalışır.
  • Diğer özellikleri: nesne yönelimli, güçlü tip denetimi, otomatik bellek yönetimi (çöp toplama) ve geniş sınıf kütüphanesi.
  • 2018'den beri her altı ayda bir yeni sürüm çıkar; LTS (uzun süreli destek) sürümleri yıllarca güncelleme aldığı için kurumlarda ve derslerde tercih edilir.

Java

Java Nerelerde Kullanılır?

Kurumsal sunucular

Bankacılık, e-ticaret ve kamu sistemlerinin arka ucu; Spring ve Jakarta EE çatıları.

Android

Uygulamalar Java ya da Kotlin ile yazılır; bytecode, telefondaki Android çalışma ortamına (ART) uygun biçime çevrilir.

Büyük veri

Hadoop ve Kafka gibi veri işleme araçları JVM üzerinde çalışır.

Geliştirme araçları

IntelliJ IDEA, Eclipse ve NetBeans gibi IDE'lerin kendisi de Java ile yazılmıştır.

Akıllı kartlar

SIM kartlar ve banka kartlarındaki küçük programlar Java Card ile çalışır.

Oyun

Minecraft'ın Java Sürümü; masaüstü oyun ve simülasyonlar.

JVM yalnızca Java'yı değil, aynı bytecode'a derlenen Kotlin, Scala ve Groovy gibi dilleri de çalıştırır.

Java

JDK, JRE ve JVM

JDK — geliştirme kitijavacjavajarjavadocjshellJRE — çalışma ortamıJava sınıf kütüphanesijava.lang · java.util · java.io …JVM — sanal makinesınıf yükleyicibytecode doğrulayıcıyorumlayıcı + JITçöp toplayıcı
  • JVM (Java Sanal Makinesi) bytecode'u yürüten sanal makinedir.
  • JRE = JVM + sınıf kütüphanesi: programı çalıştırmak için gerekenler.
  • JDK = JRE + geliştirme araçları (javac, jar, javadoc…). Geliştirici JDK kurar.
  • Oracle, Java 11'den beri ayrı JRE sunmaz; geliştirici JDK kurar (bazı dağıtıcılar JRE'yi ayrıca sunar).

Java

İlk Java Programı

public class Merhaba {public static void main(String[] args) {System.out.println("Merhaba");}}sınıf bildirimiad = dosya adı: Merhaba.javamain metoduprogramın giriş noktasıdeyimkonsola yaz; ; ile biter} main bloğu biter} sınıf bloğu biter
public

her yerden erişilebilir

static

nesne oluşturmadan çağrılır

void

değer döndürmez

String[] args

komut satırı argümanları

Java

main Metodunun İmzası

Yazılan (hepsi derlenir)java A ile çalıştırınca
public static void main(String[] args)çalışır
public static void Main(String[] args)Error: Main method not found in class A, …
public void main(String[] args)Error: Main method is not static in class A, …
public static int main(String[] args)Error: Main method must return a value of type void in class A, …
static void main(String[] args)Error: Main method not found in class A, …
  • Derleyici için hepsi sıradan bir metottur; bu yüzden hata derlemede değil, başlatırken çıkar. JVM giriş noktasını adı, parametresi ve dönüş tipiyle arar.
  • Parametre adı serbesttir (String[] a); String args[] yazımı da geçerlidir. main küçük harfle yazılır: Java büyük-küçük harfe duyarlıdır.
  • İletiler JDK 21 ile alınmıştır. Java 25'ten itibaren public ya da static olmayan main da başlatılabilir; bu derste klasik imza kullanılır.

Java · Kodu adım adım çalıştır

Kod İzleme: Merhaba

Merhaba.classbytecodeJVMmain() çalıştırırSystem.outçıktı akışıKonsol▌

java Merhaba komutuyla JVM başlar ve Merhaba sınıfını (Merhaba.class) belleğe yükler.

Merhaba.classbytecodeJVMmain() çalıştırırSystem.outçıktı akışıKonsol▌

JVM main metodunu çağırır: yığında main çerçevesi açılır. Komut satırında argüman verilmediği için args boştur.

Merhaba.classbytecodeJVMmain() çalıştırırSystem.outçıktı akışıKonsol▌

Deyim çalışır: "Merhaba" metni System.out.println metoduna gönderilir.

Merhaba.classbytecodeJVMmain() çalıştırırSystem.outçıktı akışıKonsolMerhaba▌

println metni yazar ve satır sonu ekler: imleç alt satıra geçer. Metot biter, main'e dönülür.

Merhaba.classbytecodeJVMmain() çalıştırırSystem.outçıktı akışıKonsolMerhaba▌

main bloğunun } karakterine gelindi: main biter, çerçevesi yığından kaldırılır.

Merhaba.classbytecodeJVMmain() çalıştırırSystem.outçıktı akışıKonsolMerhaba▌

Çalışacak başka kod yok: JVM kapanır, program sonlanır. Toplam 1 deyim çalıştı, 1 satır çıktı üretildi.

public class Merhaba {
    public static void main(String[] args) {
        System.out.println("Merhaba");
    }
}

Java · Kodu adım adım çalıştır

Kod İzleme: Komut Satırı Argümanları

> java Selamla Ali Veliargs"Ali"args[0]"Veli"args[1]args.length = 2

Sınıf adından sonra yazılan sözcükler komut satırı argümanlarıdır. JVM bunları bir String dizisine koyup main'e verir.

> java Selamla Ali Veliargs"Ali"args[0]"Veli"args[1]args.length = 2

args.length dizideki argüman sayısıdır: 2.

> java Selamla Ali Veliargs"Ali"args[0]"Veli"args[1]args.length = 2

İlk argüman args[0]'dadır (indis 0'dan başlar): Selam Ali.

> java Selamla Ali Veliargs"Ali"args[0]"Veli"args[1]args.length = 2

args[1] → Veli. main biter, program sonlanır.

> java Selamla Aliargs"Ali"args[0]—args[1]args.length = 1

İkinci çalıştırma: aynı .class, bu kez tek argüman. Kod değişmedi, yeniden derlemek gerekmez.

> java Selamla Aliargs"Ali"args[0]—args[1]args.length = 1

args.length = 1.

> java Selamla Aliargs"Ali"args[0]—args[1]args.length = 1

args[0] var: Selam Ali.

> java Selamla Aliargs"Ali"args[0]yok!args[1]args.length = 1

args[1] yok: JVM ArrayIndexOutOfBoundsException fırlatır ve program durur. Derleyici bunu bilemezdi; hata çalışırken, girdiye bağlı olarak çıktı.

public class Selamla {
    public static void main(String[] args) {
        System.out.println(args.length);
        System.out.println("Selam " + args[0]);
        System.out.println("Selam " + args[1]);
    }
}

Java · Kodu adım adım çalıştır

Kod İzleme: print ve println

Konsol▌imleç: ▌satır 1, sütun 1

JVM main metodunu çağırır; konsol henüz boş, imleç 1. satırın başında.

KonsolMerhaba ▌imleç: ▌satır 1, sütun 9

print "Merhaba " yazar ama satır sonu eklemez: imleç aynı satırda, boşluğun hemen arkasında kalır.

KonsolMerhaba Dünya▌imleç: ▌satır 2, sütun 1

println "Dünya" yazar ve satır sonu ekler: sonraki çıktı alt satırdan başlar.

KonsolMerhaba DünyaJava▌imleç: ▌satır 3, sütun 1

println "Java" yazar ve satır sonu ekler: sonraki çıktı alt satırdan başlar.

KonsolMerhaba DünyaJava▌imleç: ▌satır 3, sütun 1

main biter; konsolda 2 satır var: 3 çağrı yapıldı ama yalnızca println satırı bitirdi.

public class Selam {
    public static void main(String[] args) {
        System.out.print("Merhaba ");
        System.out.println("Dünya");
        System.out.println("Java");
    }
}

Java

Kaçış Dizileri

DiziAnlamıÖrnekÇıktı
\nyeni satır"A\nB"A, alt satırda B
\tsekme (tab)"Ad\tNot"Ad      Not
\"çift tırnak"\"Java\"""Java"
\\ters eğik çizgi"C:\\ders"C:\ders
\'tek tırnak (char içinde)'\'''
  • Dizgi içinde yazılamayan veya özel anlamı olan karakterler \ ile başlayan dizilerle yazılır.
  • Tırnak içindeki " metni bitirir; metnin parçası olacaksa \" yazılır.

Java · Kodu adım adım çalıştır

Kod İzleme: Kaçış Dizileri

Konsol▌

main başlar; konsol boş.

KonsolAd      Not▌

\t imleci bir sonraki sekme durağına (9. sütun) taşır.

KonsolAd      NotAli     85▌

Sekme sayesinde 85, Not başlığının altına hizalanır: basit tablo.

KonsolAd      NotAli     85"Java" dili▌

\" metni bitirmeden çift tırnak yazar.

Konsol"Java" diliSatır 1Satır 2▌

Tek print iki satır üretti: \n satır sonu karakteridir; println de satır sonu ekler (Windows'ta \r\n).

public class Kacis {
    public static void main(String[] args) {
        System.out.println("Ad\tNot");
        System.out.println("Ali\t85");
        System.out.println("\"Java\" dili");
        System.out.print("Satır 1\nSatır 2\n");
    }
}

Java

Kaçış Dizisi Tuzakları

kaynakta: "C:\new"C:\nyeni satırewekranda:C:ew
DeyimSonuç
System.out.println("C:\yeni");derleme hatası: illegal escape character; \y diye bir kaçış dizisi yok
System.out.println("C:\new");derlenir ama iki satır yazar: C: ve ew
System.out.println("C:\\yeni");C:\yeni: ters eğik çizgi iki kez yazılır
System.out.println("Ali'nin notu");Ali'nin notu: dizgi içinde tek tırnak kaçışsız yazılır
System.out.println("\u00C7ay");Çay: \u ve dört onaltılık basamak bir Unicode karakteri verir

Windows dosya yolu yazarken en sık yapılan hata tek ters eğik çizgidir; Java dosya işlemlerinde "C:/yeni" biçimi de kabul edilir.

Java

Dizgi Birleştirme: + İki İş Yapar

  • İki sayı arasında + toplar; işlenenlerden biri String ise birleştirir: sayı metne çevrilip sona eklenir.
  • Aynı önceliktekiler soldan sağa değerlendirilir; * ve / her zaman +'dan önce yapılır.
System.out.println("Puan: " + 40 + 45);"Puan: " + 401"Puan: 40" + 452"Puan: 4045"soldan sağa
İfadeÇıktıNeden?
40 + 45 + " puan"85 puanönce iki int toplanır, sonra metin eklenir
"Puan: " + 40 + 45Puan: 4045en soldaki String; ikisi de metne eklenir
"Puan: " + (40 + 45)Puan: 85parantez önce hesaplanır
"Ort: " + 85 / 2Ort: 42/ önce; iki int bölününce kesir atılır

Kaynak Kod

Java Dosyasının Yapısı

package okul;

import java.util.Scanner;

public class Program {
    public static void main(String[] args) {
        System.out.println("Merhaba");
    }
}
okul/Program.java1 · package okul;2 · import …;3 · class Program { … }main( … ) { … }deyim;deyim;
  • package ve import bildirimleri sınıftan önce gelir; public sınıf adı dosya adıyla eşleşir.
  • package okul; → dosya okul/ klasöründe durur; çalıştırma: java okul.Program.

Çalıştırma

Derleme Hattı Adım Adım

Merhaba.javakaynak kodjavacderleyiciMerhaba.classbytecodeJVMjava komutuKonsolçıktıDüzenleyicide yazılan düz metin:public class Merhaba { … println("Merhaba"); … }C:\ders> (dosya kaydedildi: Merhaba.java)

1. Yaz: kaynak kod Merhaba.java adıyla kaydedilir. Dosya adı public sınıf adıyla aynı olmalıdır.

Merhaba.javakaynak kodjavacderleyiciMerhaba.classbytecodeJVMjava komutuKonsolçıktıjavac kaynak kodu okur; söz dizimini ve tipleri denetler.Hata yoksa bytecode üretir.C:\ders> javac Merhaba.java

2. Derle: javac (JDK'daki derleyici) tüm dosyayı çalıştırmadan önce denetler.

Merhaba.javakaynak kodjavacderleyiciMerhaba.classbytecodeJVMjava komutuKonsolçıktıİşlemciden bağımsız ara kod; dosya CA FE BA BE baytlarıyla başlar.Merhaba.class  (düz metin değil, ikili dosya)C:\ders> dir   →   Merhaba.class

3. Bytecode: derleme başarılıysa aynı klasörde Merhaba.class oluşur. Bu dosya Windows, Linux ve macOS'ta aynıdır.

Merhaba.javakaynak kodjavacderleyiciMerhaba.classbytecodeJVMjava komutuKonsolçıktıSınıf yükleyici .class dosyasını belleğe alır,doğrulayıcı bytecode'u denetler, sonra main çağrılır.C:\ders> java Merhaba

4. Çalıştır: java Merhaba JVM'yi başlatır. Sınıf adı yazılır; .class uzantısı yazılmaz.

Merhaba.javakaynak kodjavacderleyiciMerhaba.classbytecodeJVMjava komutuKonsolçıktıJVM bytecode'u yorumlar; sık çalışan kısımları JIT ilemakine koduna çevirir. println konsola yazar.Merhaba

5. Çıktı: konsolda Merhaba görünür. Değişiklik yaparsanız yeniden derlemeniz gerekir.

Merhaba.javakaynak kodjavacderleyiciMerhaba.classbytecodeJVMjava komutuKonsolçıktı✗Merhaba.java:3: error: ';' expectedDerleme hatası: .class üretilmez, çalıştırılacak bir şey yoktur.C:\ders> javac Merhaba.java   (1 error)

Hata olursa: javac satır numarasıyla hata bildirir ve .class üretmez. Önce derleme hataları giderilir.

Çalıştırma

JDK Kurulumu ve Komutlar

KomutNe yapar?
java -versionkurulu Java sürümünü gösterir
javac -versionderleyici sürümünü gösterir (javac yalnız JDK içindedir)
javac Merhaba.javaderler: Merhaba.class üretir
java Merhabaçalıştırır (uzantı yazılmaz)
java Merhaba.javaJava 11+: derle ve çalıştır tek adımda, .class bırakmaz
PATH ve JAVA_HOME

Komutlar bulunamıyorsa JDK'nın bin klasörünü PATH ortam değişkenine ekle. JAVA_HOME JDK klasörünü gösterir; araçlar bunu kullanır.

Windows konsolunda Türkçe

Derlerken javac -encoding UTF-8 Merhaba.java. Çıktıda harfler bozuksa konsolda önce chcp 65001 çalıştır.

Çalıştırma · Komutları adım adım çalıştır

Konsol Oturumu: Derle, Değiştir, Yeniden Derle

çalışma klasörüMerhaba.javaprintln("Merhaba")Merhaba.classbytecode: "Merhaba" yazargünceljavac yeni dosya üretti

Derleme başarılı olduğunda javac hiçbir şey yazmaz; sessizce Merhaba.class oluşur.

çalışma klasörüMerhaba.javaprintln("Merhaba")Merhaba.classbytecode: "Merhaba" yazargüncel

JVM Merhaba.class'ı yükler ve çalıştırır.

çalışma klasörüMerhaba.javaprintln("Selam")Merhaba.classbytecode: "Merhaba" yazareski!kaynak değişti, .class değişmedi

Kaynak düzenlendi ve kaydedildi. Ama .class dosyası kendiliğinden güncellenmez.

çalışma klasörüMerhaba.javaprintln("Selam")Merhaba.classbytecode: "Merhaba" yazareski!

Çıktı hâlâ Merhaba: java komutu kaynağa bakmaz, yalnızca .class'taki bytecode'u çalıştırır.

çalışma klasörüMerhaba.javaprintln("Selam")Merhaba.classbytecode: "Selam" yazargüncelyeniden derlendi

Yeniden derleme .class dosyasını yeniler.

çalışma klasörüMerhaba.javaprintln("Selam")Merhaba.classbytecode: "Selam" yazargüncel

Değişiklik artık görünüyor: Selam.

çalışma klasörüMerhaba.javaprintln("Selam")Merhaba.classbytecode: "Selam" yazargünceljava bir sınıf adı bekler, dosya adı değil

java'ya dosya adı verildi: JVM "Merhaba.class" adlı bir sınıf arar, bulamaz. Uzantı yazılmaz.

> javac Merhaba.java
> java Merhaba
  (düzenleyicide "Merhaba" → "Selam", kaydet)
> java Merhaba
> javac Merhaba.java
> java Merhaba
> java Merhaba.class

Çalıştırma

IDE ile Çalışmak

Proje · Merhaba.java▶ Çalıştırproje▾ srcMerhaba.java1public class Merhaba {2 public static void main(String[] args) {3 System.out.println("Merhaba")4 }5}';' expectedKonsoldüzeltip ▶ Çalıştır'a basınca: javac + java → Merhaba
  • ▶ Çalıştır düğmesi arka planda derleme ve çalıştırma adımlarını yapar; değiştirilen dosya önce yeniden derlenir, eski .class sorunu yaşanmaz.
  • Derleme hataları daha yazarken kırmızı alt çizgiyle işaretlenir; imleç üzerine gelince derleyicinin iletisi görünür.
  • Kod tamamlama, otomatik girinti, yeniden adlandırma ve kesme noktalı hata ayıklayıcı sunar. Yaygın Java IDE'leri: IntelliJ IDEA, Eclipse, NetBeans; VS Code Java eklentileriyle.
  • IDE kolaylık sağlar, ama arka planda olanı bilmek IDE'nin olmadığı ortamlarda (sunucu, uzak bağlantı) hata iletisini anlamayı sağlar.

Çalıştırma

Bytecode ve JVM

Merhaba.classJVMWindowsx86-64makine koduJVMLinuxx86-64makine koduJVMmacOSARM64makine kodubir kez derle, JVM olan her yerde çalıştır
  • Derleyici işlemciye özel makine kodu yerine bytecode üretir.
  • Her platformun kendi JVM'si bytecode'u yorumlar; sık çalışan kısımları JIT ile o işlemcinin makine koduna çevirir.
  • Sınıf yükleme, doğrulama ve bellek yönetimi (çöp toplama) çalışma ortamının parçalarıdır.

Çalıştırma

Bytecode'un İçi: javap

> javap -c Merhaba
...
public static void main(java.lang.String[]);
  Code:
     0: getstatic     // System.out
     3: ldc           // "Merhaba"
     5: invokevirtual // println
     8: return

javap sabit havuzu göstergelerini de yazar; burada kısaltıldı.

  • javap -c JDK ile gelir; .class dosyasındaki komutları okunur biçimde listeler.
  • getstatic System.out nesnesini, ldc "Merhaba" sabitini işlenen yığınına koyar.
  • invokevirtual ikisini yığından alıp println'i çağırır; return main'i bitirir.
  • Her komutun işlem kodu bir bayttır; "bytecode" adı buradan gelir. Soldaki sayılar komutun bayt konumudur.
JVM bir yığın makinesidir: işlemciler gibi yazmaç kullanmak yerine değerleri bir işlenen yığınına koyar, işlemleri yığının tepesindeki değerlerle yapar.

Çalıştırma · Kodu adım adım çalıştır

Kod İzleme: JVM Bytecode'u Yürütüyor

kaynak:int a = 3;yerel değişkenlerargs0 args31 a—2 b—3 cişlenen yığınıboş

Kaynaktaki dört satır javap -c ile görülen 12 komuta derlendi. iconst_3 yığına 3 koyar, istore_1 onu alıp 1 numaralı yerel değişkene (a) yazar.

kaynak:int b = 4;yerel değişkenlerargs0 args31 a42 b—3 cişlenen yığınıboş

Aynı çift b için: 4 yığına, oradan 2 numaralı yuvaya.

kaynak:int c = a + b;yerel değişkenlerargs0 args31 a42 b—3 cişlenen yığını3

iload_1 a'nın değerini yığına kopyalar: [3].

kaynak:int c = a + b;yerel değişkenlerargs0 args31 a42 b—3 cişlenen yığını34

iload_2: [3, 4]. Toplanacak iki değer yığının tepesinde.

kaynak:int c = a + b;yerel değişkenlerargs0 args31 a42 b—3 cişlenen yığını7

iadd üstteki iki değeri alır, toplar ve sonucu geri koyar: [7].

kaynak:int c = a + b;yerel değişkenlerargs0 args31 a42 b73 cişlenen yığınıboş

istore_3: 7 yığından alınır, c'ye yazılır. Yığın yeniden boş.

kaynak:System.out.println(c);yerel değişkenlerargs0 args31 a42 b73 cişlenen yığınıSystem.out

getstatic System.out nesnesinin başvurusunu yığına koyar.

kaynak:System.out.println(c);yerel değişkenlerargs0 args31 a42 b73 cişlenen yığınıSystem.out7

iload_3: yazdırılacak değer (7) de yığında.

kaynak:System.out.println(c);yerel değişkenlerargs0 args31 a42 b73 cişlenen yığınıboş

invokevirtual iki değeri yığından alır ve println(int)'i çağırır: konsola 7 yazılır.

kaynak:}yerel değişkenlerargs0 args31 a42 b73 cişlenen yığınıboş

return: main biter, çerçeve kaldırılır. Yerel değişkenler ve işlenen yığını çerçeveyle birlikte yok olur.

 0: iconst_3
 1: istore_1
 2: iconst_4
 3: istore_2
 4: iload_1
 5: iload_2
 6: iadd
 7: istore_3
 8: getstatic     // System.out
11: iload_3
12: invokevirtual // println(int)
15: return

Dil Yapısı

Temel Programlama Unsurları

inttoplam=fiyat*3;anahtar sözcüktanımlayıcıişleçtanımlayıcıişleçsabit değerayırıcı
  • Derleyici kodu önce belirteçlere (token) ayırır: anahtar sözcük, tanımlayıcı, sabit değer, işleç, ayırıcı.
  • Java büyük-küçük harfe duyarlıdır: sayi ve Sayi farklı adlardır.
  • Deyimler çoğunlukla noktalı virgülle biter; bloklar süslü parantezle çevrilir.

Dil Yapısı

Boşluk, Girinti ve Süslü Parantez

public class Tek { public static void main(String[] args) { System.out.println("Merhaba"); } }
public class Tek {
    public static void main(String[] args) {
        System.out.println("Merhaba");
    }
}
  • İki program aynı bytecode'a derlenir: derleyici için boşluk, sekme ve satır sonu yalnızca belirteçleri birbirinden ayırır. x=1; ile x = 1; aynıdır, ama publicclass tek bir sözcük sayılır.
  • Girinti blokların iç içeliğini okuyana gösterir: her yeni blok 4 boşluk içeriden başlar, kapanan } açtığı satırın hizasına döner.
  • Java geleneğinde açılış { satırın sonunda durur. Dizgi içindeki boşluklar ise metnin parçasıdır: "Merhaba " ile "Merhaba" farklıdır.

Dil Yapısı

İfadeler ve Deyimler

  • İfade bir değer üretir: 2 + 3 → 5, sayi > 0 → true.
  • Deyim bir işlemi tamamlar: toplam = 5; veya System.out.println(toplam);
  • Blok, süslü parantez içindeki deyimleri tek yapı olarak gruplar.
  • Bir deyimin içinde bir veya daha çok ifade bulunabilir.
blok { … }deyim (atama)toplam=fiyat * adet;ifade → 360deyim (atama)indirim=toplam > 300;ifade → true

Dil Yapısı · Kodu adım adım çalıştır

İfade, Deyim ve Blok Adım Adım

Bellek (değişkenler)fiyat120intadet?inttoplam?int

fiyat için bellekte int kutusu ayrılır ve 120 yazılır.

Bellek (değişkenler)fiyat120intadet3inttoplam?int

adet kutusu oluşur: 3.

Bellek (değişkenler)fiyat120intadet3inttoplam?intİfadefiyat * adet120 * 3→ 360

Önce sağdaki ifade değerlendirilir: fiyat * adet → 120 * 3 → 360.

Bellek (değişkenler)fiyat120intadet3inttoplam360int

Üretilen değer toplam kutusuna atanır: toplam = 360.

Bellek (değişkenler)fiyat120intadet3inttoplam360intİfadetoplam > 300360 > 300→ true

Koşul ifadesi: toplam > 300 → 360 > 300 → true. Doğru olduğu için bloğa girilir.

Bellek (değişkenler)fiyat120intadet3inttoplam360int

Blok içindeki deyim çalışır: konsola İndirim yazılır.

Bellek (değişkenler)fiyat120intadet3inttoplam360int

Blok biter. adet = 2 olsaydı toplam 240 olur, koşul false olur ve blok hiç çalışmazdı.

int fiyat = 120;           // tanımlama deyimi
int adet = 3;              // tanımlama deyimi
int toplam = fiyat * adet; // ifade + atama
if (toplam > 300) {        // koşul + blok
    System.out.println("İndirim");
}

Kaynak Kod

Açıklamalar

  • // satır sonuna kadar açıklamadır.
  • /* ... */ birden fazla satırı kapsar.
  • /** ... */ Javadoc (API belgesi) açıklamasıdır.
  • Derleyici açıklamaları atlar; bytecode'a girmezler.
  • Açıklama kodun ne yaptığını tekrarlamak yerine nedenini açıklamalıdır.
/** Merhaba programı (Javadoc). */
public class Merhaba {
    /* Birden fazla satıra
       yayılan açıklama */
    public static void main(String[] args) {
        // selamı yaz
        System.out.println("Merhaba");
    }
}
// selamı yazSystem.out.println("Merhaba");/* açıklama */javacaçıklamaları atlargetstatic System.outldc "Merhaba"invokevirtual printlnreturnMerhaba.java (kaynak)Merhaba.class (bytecode): açıklama yok

Kaynak Kod

Açıklama Tuzakları

KodNe olur?
/* dış /* iç */ kalan */derleme hatası: illegal start of expression. Açıklama ilk */'da biter; kalan */ kod sanılır.
System.out.println("a // b");a // b yazılır: tırnak içindeki // açıklama değil, metnin parçasıdır.
// System.out.println(x);satır geçici olarak devre dışı kalır; IDE'lerde Ctrl+/ seçili satırları bu biçimde açıklamaya çevirir.
double fiyat = net * 1.20; // KDV %18derlenir, ama açıklama kodla çelişiyor: güncellenmemiş açıklama okuyanı yanıltır.
  • İçinde /* */ bulunan bir bölümü kapatmak için satırları tek tek // ile açıklama yapmak daha güvenlidir.
  • Açıklama ile kod çeliştiğinde derleyici kodu çalıştırır; doğru olan her zaman koddur.

Temeller

Hata Türleri

Kodu yazDerle (javac)söz dizimi · tip hatasıÇalıştır (JVM)çalışma zamanı hatasıSonucu kontrol etmantık hatası
HataNe zaman?Örnek
Söz dizimiDerleme sırasındaEksik noktalı virgül
TipDerleme sırasındaMetni sayıya atama
Çalışma zamanıProgram çalışırkenSıfıra bölme
MantıkProgram çalışır ama sonuç yanlıştırYanlış koşul

Temeller · Adım adım

Hata Türleri Örneklerle

Söz dizimi hatası

Kodu yazDerle (javac)Çalıştır (JVM)Sonucu kontrol et
public class Hata1 {
    public static void main(String[] args) {
        System.out.println("Merhaba")
    }
}
Hata1.java:3: error: ';' expected
        System.out.println("Merhaba")
                                     ^
1 error

Derleyici kuralı bozulan yeri satır numarasıyla gösterir; .class üretilmez. Düzeltme: satır sonuna ; ekle.

Tip hatası

Kodu yazDerle (javac)Çalıştır (JVM)Sonucu kontrol et
public class Hata2 {
    public static void main(String[] args) {
        int sayi = "42";
    }
}
Hata2.java:3: error: incompatible types: String cannot be converted to int
        int sayi = "42";
                   ^
1 error

Dizgi (String) int kutusuna konamaz. Tipler derleme sırasında denetlenir. Düzeltme: int sayi = 42;

Çalışma zamanı hatası

Kodu yazDerle (javac)Çalıştır (JVM)Sonucu kontrol et
public class Hata3 {
    public static void main(String[] args) {
        int a = 10, b = 0;
        System.out.println(a / b);
    }
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Hata3.main(Hata3.java:4)

Kod derlenir, ancak çalışırken tam sayı sıfıra bölünür: JVM bir istisna fırlatır ve program durur.

Mantık hatası

Kodu yazDerle (javac)Çalıştır (JVM)Sonucu kontrol et
public class Hata4 {
    public static void main(String[] args) {
        int a = 70, b = 90;
        System.out.println(a + b / 2);
    }
}
115

Hata iletisi yok, ama sonuç yanlış: beklenen 80. / önce yapılır: 70 + 45. Düzeltme: (a + b) / 2.

Temeller · Gerçek javac / java iletileri

Sık Derleme Hataları

HataGerçek iletiÇözüm
Noktalı virgül yokMerhaba.java:3: error: ';' expectedönceki deyimin sonuna ; ekle
Metot adı yanlış
(System.out.printn)
error: cannot find symbol
symbol:   method printn(String)
location: variable out of type PrintStream
adı println yap
Küçük harf
(system.out)
error: package system does not existSystem büyük S ile yazılır
Ad ile dosya uyuşmuyorerror: class Selam is public, should be declared in a file named Selam.javadosya adı = public sınıf adı
Yanlış çalıştırma
(java Selam)
Error: Could not find or load main class Selam.class yok ya da ad/konum yanlış; uzantı yazma

İletiler JDK 21 ile alınmıştır; sürüme göre ek satırlar (ör. Caused by: ClassNotFoundException) çıkabilir. Her zaman ilk hatadan başla.

Temeller

Hata İletisini Okumak

Not.java:3: error: ';' expected int puan = 85 ^1 errordosyasatırtüraçıklama← ^ hatanın fark edildiği yerException in thread "main" java.lang.ArithmeticException: / by zero at Hata3.main(Hata3.java:4)← yığın izi: hangi metot, hangi dosya ve satır
  • javac iletisi dosya:satır: error: açıklama biçimindedir; altında sorunlu kaynak satırı ve hatanın fark edildiği sütunu gösteren ^ işareti yer alır.
  • ^ her zaman hatanın kendisini değil, derleyicinin onu fark ettiği yeri gösterir: eksik ; satırın sonunda, eksik } ise dosyanın sonunda (reached end of file while parsing) bildirilir.
  • Çalışma zamanı hatasında ilk satır istisnanın türünü ve ayrıntısını, at ile başlayan yığın izi satırları hatanın oluştuğu metodu ve satırı verir.

Temeller · Kodu adım adım düzelt

Kod İzleme: Hataları Sırayla Düzeltme

3int puan = 85✗ bildirildi4System.out.printn("Puan: " + puan);? henüz bildirilmediNot.class: yok

İlk derleme: yalnız bir hata bildirilir. javac söz dizimi bozuk olduğu sürece anlam denetimine geçmez; 4. satırdaki yanlış henüz görünmez.

3int puan = 85;✓ düzeltildi4System.out.printn("Puan: " + puan);? henüz bildirilmediNot.class: yok

İletinin gösterdiği yer düzeltilir: satır sonuna ; eklenir ve dosya kaydedilir.

3int puan = 85;✓ düzeltildi4System.out.printn("Puan: " + puan);✗ şimdi bildirildiNot.class: yok

Yeniden derleme: söz dizimi artık doğru, anlam denetimi çalışır ve printn adlı metodu bulamaz.

3int puan = 85;✓ düzeltildi4System.out.println("Puan: " + puan);✓ düzeltildiNot.class: yok

symbol: satırı bulunamayan adı söyler: metot adı println olarak düzeltilir.

3int puan = 85;✓ düzeltildi4System.out.println("Puan: " + puan);✓ düzeltildiNot.class: oluştu

Üçüncü derleme sessizce başarılı olur, Not.class oluşur ve program çalışır. Hata sayısı bir düzeltmeden sonra azalmayabilir, artabilir de: her zaman ilk hatadan başlanır.

public class Not {
    public static void main(String[] args) {
        int puan = 85
        System.out.printn("Puan: " + puan);
    }
}

Tasarım

Program Bir Tariftir

Girdiyi alnot1 = 70, not2 = 90Doğrula0 ≤ not ≤ 100 mü?İşle(70 + 90) / 2 = 80Sonucu üret"Ortalama: 80"
  • Her adımın ön koşulu ve ürettiği değer belirlenmelidir.
  • Büyük tarifler alt görevlere ayrılır (Java'da bunlar ileride metot olacak).
Tarifi kodlamadan önce elle sınayın: 70 ve 90 için adımları izleyince 80 çıkıyor mu? 101 girilirse hangi adım durdurur?

Tasarım

Kodlamadan Önce

  • Örnek girdi ve beklenen çıktıyı yazın.
  • Çözümü doğal dil veya sözde kodla adımlara ayırın.
  • Sınır durumlarını ve hata davranışını belirleyin.
  • Ardından adımları Java yapılarına dönüştürün.
Not girdisi için örnek değerler sayı doğrusunda (ölçeksiz)07090100alt sınır (0, 0)olağan (70, 90)geçersiz (101)101geçersizgeçerli not aralığı: 0–100geçersiz
Örnek girdiBeklenen çıktıNeden?
70, 9080olağan durum
0, 00alt sınır
101, 50hata iletisigeçersiz girdi

Özet

Bölüm Özeti

  • Program, bilgisayarın bir görevi yerine getirmek için yürüttüğü komutlar bütünüdür.
  • Java kaynak dosyası javac ile bytecode'a derlenir ve JVM üzerinde çalışır.
  • public sınıf adı dosya adıyla eşleşir; main programın giriş noktasıdır.
  • İfadeler değer üretir, deyimler işlemi tamamlar, bloklar deyimleri gruplar.
  • Kodlamadan önce örnek girdi, beklenen çıktı ve sınır durumları belirlenir.
Merhaba.javapublic class MerhabajavacMerhaba.classbytecodeJVMçıktıDosya adı = public sınıf adı; JVM çalıştırmaya main metodundan başlar.

Özet

Kontrol Soruları

  1. JDK, bytecode ve JVM arasındaki ilişki nedir?
  2. Merhaba.java dosyası hangi komutlarla derlenip çalıştırılır?
  3. main metodunun görevi nedir?
  4. İfade ile deyim arasındaki fark nedir?
  5. Söz dizimi hatası ile mantık hatası nasıl ayrılır?
  6. Kaynak kod değiştirilip yeniden derlenmezse java komutu neyi çalıştırır?
  7. "Puan: " + 40 + 45 ifadesi neden Puan: 4045 verir?
  8. Komut satırı argümanları programa nasıl ulaşır?

Özet

Alıştırmalar

  1. Adınızı, bölümünüzü ve öğrenci numaranızı üç ayrı satırda yazdıran Kimlik programını yazın, derleyin, çalıştırın.
  2. Aynı çıktıyı tek bir println ve \n kullanarak üretin.
  3. \t ile üç satırlık bir ders–kredi tablosu yazdırın.
  4. System.out.println("Merhaba") satırındaki ; işaretini silip derleyin; hata iletisinin satır numarasını ve ^ işaretini yorumlayın.
  5. Sınıf adını Merhaba, dosya adını merhaba.java yapıp derleyin. Ne olur, neden?
  6. System.out.println(5 + 3); ile System.out.println("5 + 3"); çıktılarını tahmin edin; çalıştırarak doğrulayın.

Özet

Kaynaklar

Son

Java'ya Giriş ve İlk Program
Sonraki sunum: Değişkenler, Veri Tipleri ve İşleçler · Çalışma soruları · Simülatör: Java Derleme ve Çalıştırma · Terim sözlüğü
1 / 1Sercan KÜLCÜ, Tüm hakları saklıdır.