Java: JDK Kurulumu ve İlk Merhaba, Dünya!
JDK 25'i Windows, macOS ve Linux'a kur, PATH'i anla, ilk Java programını yaz, derle ve çalıştır. javac, java, jshell ve ilk hata mesajları, ekran ekran.
Seri · Java
- 1. Java: Java Nedir ve Nasıl Çalışır?
- 2. Java: JVM'in Derinliklerine Yolculuk
- 3. Java: JDK Kurulumu ve İlk Merhaba, Dünya!
İki bölümdür konuştuk. İlk bölümde Java’nın ne olduğunu ve javac ile JVM’in nasıl el ele çalıştığını gördük; ikinci bölümde JVM’in kapısından girip depoyu, masaları ve mutfağı gezdik. Bugün konuşmayı bırakıyoruz. Java’yı bilgisayarına kuracak, ilk programını kendi ellerinle yazacak ve ekranda “Merhaba, dünya!” yazısını göreceksin.
Açıkçası bu, serinin en keyifli anı. Algoritmalar serisinde kâğıt üstünde çay demledik, posta kutularına değer koyduk, döngüler çizdik; hep “gerçek bir dilde de böyle” dedik. O gün bugün. Kâğıttaki YAZ komutu, bugün gerçek bir bilgisayarda gerçekten bir şey yazacak.
Neyi kuruyoruz? JDK, JRE ve JVM
Bölüm 1’de bir matruşka bebek çizmiştik; hatırla: en içte JVM (bytecode’u çalıştıran motor), onun etrafında JRE (motor + Java’nın hazır kütüphaneleri; bir programı çalıştırmaya yeter), en dışta JDK (JRE + program yazmak için araçlar: derleyici, deneme tahtası, hata ayıklayıcı).
flowchart TD
subgraph JDK["JDK: geliştirme kiti"]
direction TB
T["javac, jshell, javap, jar, javadoc ..."]
subgraph JRE["JRE: çalıştırma ortamı"]
direction TB
L["Hazır kütüphaneler<br/>(String, List, dosya, ağ ...)"]
JVM["JVM<br/>bytecode'u çalıştıran motor"]
end
endProgram yazacağımız için en dıştaki bebeği, JDK’yı kuracağız. Kütüphaneler ve JVM onun içinde geliyor. Eski yazılarda “önce JRE’yi kur” cümlesine rastlarsan şaşırma: Java 11’den beri (2018) ayrı bir JRE indirmek gerekmiyor, çoğu dağıtım yalnızca JDK veriyor.
Hangi sürüm? Neden 25?
Java’nın sürüm takvimi, Bölüm 1’deki sürüm tablosundan hatırlayacağın gibi bir tren tarifesi gibi: her Mart ve Eylül’de yeni bir sürüm kalkar. Ama her tren uzun yol treni değil. Sürümlerin çoğu altı ay sonra bir sonraki gelince desteğini yitirir; iki yılda bir çıkanlar ise yıllarca güncelleme alır. Bunlara LTS (Long-Term Support, uzun süreli destek) denir: 8, 11, 17, 21, 25 ve 2027’de gelecek 29.
| Sürüm | Çıkış | Durum |
|---|---|---|
| Java 21 | Eylül 2023 | LTS, hâlâ yaygın; bu seri için yeter ama kısa void main() çalışmaz |
| Java 25 | Eylül 2025 | LTS, güncel; bu seride kullanacağımız sürüm |
| Java 26 | Mart 2026 | Altı aylık sürüm, Eylül’de yerini 27’ye bırakıyor |
| Java 27 | Eylül 2026 | Bu ay çıkıyor; LTS değil |
Yeni başlayan biri için doğru seçim her zaman güncel LTS, yani bugün 25. Hem en yeni yazım kolaylıklarını (Bölüm 1’deki sade main) alırsın hem de iki yıl boyunca aynı sürümle çalışırsın. Bilgisayarında 21 kuruluysa paniğe gerek yok; yalnızca ilk programı klasik hâliyle yazarsın, aşağıda o da var.
Hangi JDK? Tek kaynak, birçok yapım
Şimdi kafa karıştıran kısım geliyor; indirme sayfasına gittiğinde Oracle JDK, OpenJDK, Temurin, Corretto, Zulu gibi isimler göreceksin. Hepsi Java mı? Evet. Fark ne? Red Hat yazısındaki Linux benzetmesini hatırla: çekirdek tek, dağıtım çok. Java’da da durum aynı.
flowchart TD
SRC["OpenJDK<br/>Java'nın açık kaynak kodu, tek kaynak"] --> O["Oracle JDK"]
SRC --> T["Eclipse Temurin<br/>(Adoptium)"]
SRC --> R["Red Hat build<br/>of OpenJDK"]
SRC --> A["Amazon Corretto"]
SRC --> Z["Azul Zulu"]
SRC --> M["Microsoft Build<br/>of OpenJDK"]
SRC --> D["İşletim sistemi paketleri<br/>(Fedora, Debian, Ubuntu ...)"]OpenJDK, Java’nın açık kaynak kodudur; tek bir depoda, herkesin gözü önünde geliştirilir. Şirketler bu kodu alıp derler, test eder, kendi adlarıyla dağıtır. Hepsi aynı uyumluluk testinden (TCK) geçer, dolayısıyla Merhaba.java hangisinde çalışıyorsa hepsinde çalışır.
| Yapım | Kimden | Ne zaman seçilir |
|---|---|---|
| Eclipse Temurin | Eclipse Vakfı (Adoptium) | Windows ve macOS için en pratik seçim; ücretsiz, her platform |
| Oracle JDK | Oracle | Oracle desteği isteyen kurumlar; 17’den beri ücretsiz kullanım (NFTC) |
| Red Hat build of OpenJDK | Red Hat | RHEL ve Fedora’da paket yöneticisiyle gelen sürüm; Windows için de var |
| Amazon Corretto | Amazon | AWS üstünde çalışan projeler |
| Azul Zulu | Azul | Çok eski sürümlere bile destek isteyenler |
| Microsoft Build of OpenJDK | Microsoft | Azure ve Windows odaklı projeler |
| Dağıtım paketi | Fedora, Debian, Ubuntu … | Linux’ta en kolay yol: dnf ya da apt |
Kararımız: Windows ve macOS’ta Temurin, Linux’ta paket yöneticisi. Bu yazıdaki ekranlar Red Hat’in yapımından; RHEL’de dnf ile geliyor.
Adım 1: JDK’yı kurmak
Üç işletim sistemi için üç ayrı yol. Yalnızca seninkini oku, sonra “Adım 2”ye atla.
Windows
- Tarayıcıda adoptium.net adresine git. Sayfa işletim sistemini kendisi tanır ve büyük bir “Latest LTS Release” düğmesi gösterir; altında Temurin 25 yazdığını kontrol et. Düğme
.msiuzantılı bir kurulum dosyası indirir (yaklaşık 180 MB). - İndirilen dosyaya çift tıkla. Sihirbazda “Custom Setup” ekranında dört seçenek var: Add to PATH (işaretli gelir, öyle kalsın), Associate .jar (kalsın), Set JAVA_HOME variable (işaretle; ileride işine yarayacak), JavaSoft registry anahtarları (kalsın). Next, Install; Windows yönetici onayı sorar, Evet de.
- Bitince açık terminal pencerelerini kapat ve yeniden aç. Bu adımı atlayanlar bir sonraki adımda “java is not recognized” hatası alır; PATH değişikliği yalnızca yeni pencerelerde geçerlidir.
- Yeni terminalde
java -versionvejavac -versionyaz. İkisi de 25 ile başlayan bir sürüm yazmalı.
Komut satırını sevenler için tek satırlık yol da var; yönetici olarak açılmış bir PowerShell’de:
winget install EclipseAdoptium.Temurin.25.JDKmacOS
- adoptium.net sayfası Mac’i tanır. Dikkat edeceğin tek şey işlemci: 2020 sonrası Mac’ler (M1, M2, M3, M4) aarch64, daha eski Intel Mac’ler x64. Emin değilsen sol üstteki elma menüsünden “Bu Mac Hakkında”ya bak; “Apple M” görüyorsan aarch64.
.pkgdosyasını indir. - Dosyaya çift tıkla, sihirbazı Devam, Devam, Yükle diye bitir; Mac şifreni sorar.
- Terminal uygulamasını aç (Spotlight’a “Terminal” yaz) ve
java -versionile kontrol et.
Homebrew kullanıyorsan tek satır:
brew install --cask temurin@25Linux
Linux’ta paket yöneticisini kullanacağız; Red Hat yazısında anlattığım “mağazadan indir” yolu. Dağıtımına göre:
sudo dnf install java-25-openjdk-develsudo apt install openjdk-25-jdksudo pacman -S jdk-openjdkRHEL 10 sanal makinemde önce depoda hangi sürümler var diye baktım, sonra 25’i kurdum:


Paket listesine dikkat et: java-25-openjdk-headless motorun kendisi, java-25-openjdk pencere açan programlar için grafik parçalar, java-25-openjdk-devel de bizim istediğimiz araç kutusu. Bir de tzdata-java var: Java’nın kendi saat dilimi tablosu; Red Hat yazısındaki tzdata’nın Java’ya uyarlanmış kardeşi.
Taşınabilir arşiv: kurulum programı olmadan
Hiçbir kurulum programı kullanmadan da Java çalıştırabilirsin; JDK aslında bir klasörden ibarettir. Temurin’in .tar.gz ya da .zip dosyasını, ya da Red Hat’in “portable JDK” arşivini indir, bir klasöre aç ve içindeki bin/java’yı doğrudan çalıştır. Ben Red Hat’in arşivini kendi Linux’umda denedim:
tar -xJf java-25-openjdk-25.0.4.0.7-1.0.portable.jdk.x86_64.tar.xz./java-25-openjdk-25.0.4.0.7-1.0.portable.jdk.x86_64/bin/java -versionopenjdk version "25.0.4" 2026-07-21 LTSOpenJDK Runtime Environment (Red_Hat-25.0.4.0.7-1) (build 25.0.4+7-LTS)OpenJDK 64-Bit Server VM (Red_Hat-25.0.4.0.7-1) (build 25.0.4+7-LTS, mixed mode, sharing)Kurulum programının tek yaptığı şey, bu klasörü uygun bir yere koyup bin klasörünü PATH’e eklemek. O kelimeye şimdi geliyoruz; çünkü Java’yla ilgili “çalışmıyor” şikâyetlerinin yarısı ondan çıkar.
Adım 2: Kurulumu kontrol etmek ve PATH’i anlamak
Hangi yoldan kurmuş olursan ol, kontrol aynı: yeni bir terminal aç ve şunları yaz.
java -versionjavac -version
İlk satırı okuyalım: openjdk version "25.0.4.1" 2026-08-18 LTS. openjdk, kaynağın OpenJDK olduğunu; 25.0.4.1, 25. sürümün Temmuz güncellemesi üstüne 18 Ağustos’ta çıkan küçük bir ara düzeltmeyi; LTS de uzun destekli sürüm olduğunu söylüyor. Parantez içindeki Red_Hat-25.0.4.1.1-1 yapımcının imzası; Temurin’de burada Temurin-25.0.4+7 benzeri bir şey görürsün. Son satırdaki mixed mode, Bölüm 2’de anlattığımız yorumlayıcı + JIT ikilisinin açık olduğunu, sharing ise sık kullanılan sınıfların önceden hazırlanmış bir arşivden paylaşıldığını söyler. İki satır çıktı, iki bölümlük teori.
PATH: bilgisayar javac’ı nerede arar?
Bir arkadaşına “makası getirir misin” dedin. Makas hangi çekmecede? Arkadaşın evin her yerini aramaz; mutfak çekmecesi, çalışma masası, belki banyo dolabı diye birkaç bildik yere bakar. İşletim sistemi de terminale bir komut yazdığında böyle davranır: elinde bakılacak klasörlerin listesi vardır, adı PATH, ve komutu bu klasörlerde sırayla arar.
flowchart TD
A["Terminale 'javac' yazdın"] --> B["Kabuk PATH listesini alır<br/>/usr/local/bin, /usr/bin, /bin ..."]
B --> C{"Sıradaki klasörde<br/>javac var mı?"}
C -->|"Evet"| D["Bulundu: çalıştır"]
C -->|"Hayır"| E{"Liste bitti mi?"}
E -->|"Hayır"| C
E -->|"Evet"| F["command not found /<br/>is not recognized"]Kurulum programının “Add to PATH” seçeneği, JDK’nın bin klasörünü bu listeye ekler. Linux’ta paket yöneticisi daha zarif bir yol izler: javac’ı zaten listede olan /usr/bin’e koyar, ama gerçek dosya değil, gerçek dosyaya giden bir kısayol olarak. Ekranda which java bunu /usr/bin/java diye gösterdi, readlink -f ise kısayolun sonunu: /usr/lib/jvm/java-25-openjdk/bin/java. Aradaki /etc/alternatives durağı, aynı makinede birden çok Java varken hangisinin “varsayılan” olacağını seçen mekanizma; sudo alternatives --config java ile aralarında geçiş yapılır. Windows’ta aynı bilgiyi where java verir; macOS’ta /usr/libexec/java_home -V kurulu bütün sürümleri listeler.
JAVA_HOME: araçların Java’yı bulduğu adres
PATH, java ve javac komutlarını bulmaya yarar. JAVA_HOME ise başka bir iş görür: JDK klasörünün tam adresini tutan ayrı bir ortam değişkenidir. Terminal komut çalıştırırken ona bakmaz, ama ileride tanışacağın araçların çoğu bakar. Yukarıdaki sorularda adı geçen Maven ve Gradle gibi derleme araçları, IntelliJ ve Eclipse gibi IDE’ler, Tomcat gibi uygulama sunucuları “Java nerede kurulu?” sorusunu PATH’e değil JAVA_HOME’a sorar. Şimdiden doğru ayarlamak, ileride sık karşılaşılan “JAVA_HOME is not set” hatasından kurtarır.
Windows’ta kurulum sihirbazında “Set JAVA_HOME variable” kutusunu işaretlediysen zaten ayarlı. İşaretlemediysen ya da elle yapmak istersen, işletim sistemine göre:
setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-25.0.4.7-hotspot"echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 25)' >> ~/.zshrcsource ~/.zshrcecho 'export JAVA_HOME=/usr/lib/jvm/java-25-openjdk' >> ~/.bashrcsource ~/.bashrcAyarladıktan sonra yeni bir terminal aç ve kontrol et: Linux ve macOS’ta echo $JAVA_HOME, Windows’ta (PowerShell) $env:JAVA_HOME. Çıktı JDK klasörünün yolunu yazmalı.
JDK klasöründe ne var?
Madem kurulum bir klasörden ibaret, içine bakalım. RHEL’de klasör /usr/lib/jvm/java-25-openjdk; Windows’ta C:\Program Files\Eclipse Adoptium\jdk-25..., macOS’ta /Library/Java/JavaVirtualMachines/temurin-25.jdk/Contents/Home. İçerik her yerde aynı:

| Klasör veya dosya | İçinde ne var |
|---|---|
bin/ | Araçlar: java (çalıştırıcı), javac (derleyici), jshell (deneme tahtası), javap (bytecode okuyucu), jar (paketleyici), javadoc (belge üretici), jlink ve jpackage (dağıtım paketi hazırlayıcılar), jwebserver (küçük bir web sunucusu), keytool (sertifika aracı) ve hata ayıklama araçları |
lib/ | Java’nın hazır kütüphaneleri ve JVM’in kendisi; lib/modules dosyası Bölüm 2’deki çekmecelerin (modüllerin) tamamı, tek dosyada 140 MB |
include/ | C dilinde yazılmış başlık dosyaları; Bölüm 2’deki yan kapının (JNI) dış tarafı |
conf/ | Ayar dosyaları: güvenlik, ağ, günlük |
release | Sürüm bilgisi; cat release ile kimin, ne zaman derlediğini okursun |
legal/ | Lisans metinleri |
Otuz aracın hepsini öğrenmeyeceğiz. Bugün üçü yeter: javac, java ve jshell. Bir de meraklısı için javap.
Adım 3: İlk program
Hazırsan asıl işe geçiyoruz. Üç adım: bir klasör, bir dosya, iki komut.
Klasör ve editör
- Bilgisayarında bu seri için bir klasör aç; ben
java-dersleridedim. Windows’ta Belgeler altında, macOS ve Linux’ta ev klasöründe. Terminalden de yapabilirsin:mkdir java-derslerisonracd java-dersleri. Klasör adında boşluk ve Türkçe karakter olmasın; ileride başını ağrıtır. - Bir düz metin editörü aç. Windows’ta Not Defteri, macOS’ta TextEdit (menüden Biçim → Düz Metin Yap, yoksa zengin metin kaydeder ve Java anlamaz), Linux’ta Metin Düzenleyici ya da gedit. Word ve benzeri programlar olmaz; onlar görünmez biçimlendirme ekler.
- Aşağıdaki üç satırı yaz ve klasörün içine
Merhaba.javaadıyla kaydet. Windows Not Defteri’nde “Farklı Kaydet” penceresinde “Kayıt türü”nü Tüm Dosyalar yap; yoksa dosya sessizceMerhaba.java.txtolur vejavaconu bulamaz.
void main() { IO.println("Merhaba, dünya!");}
Satır satır: bu üç satır ne diyor?
Kısa ama her kelimesi bir şey söylüyor; Fonksiyonlar yazısındaki kara kutuyu hatırla.
void main()bir kara kutu tanımlar; adımain. Java’nın kuralı: programmainadlı kutudan başlar. Bölüm 1’de “buradan başla” işareti demiştik.void, “geriye bir şey döndürmez” demek; Fonksiyonlar yazısındakiDÖNDÜRsatırı olmayan bir fonksiyon. Parantezler boş: kutu dışarıdan bir şey almıyor.{ve}kutunun gövdesini çevreler; sözde koddakiFONKSIYON ... FONKSIYON SONUçiftinin Java’daki hâli. İçindeki satırlar kutunun yaptığı iş.IO.println("Merhaba, dünya!");Sözde Kod yazısındakiYAZ "Merhaba, dünya!"satırının ta kendisi.IOJava’nın giriş-çıkış (input/output) kutusu,println“yaz ve satırı bitir” (print line). Tırnak içi bir metin; Değişkenler yazısında metin türü demiştik. Sondaki noktalı virgül cümlenin noktası: Java’da her komut onunla biter.- Girintiler (satır başındaki boşluklar) Java için zorunlu değil, senin gözün için. Alışkanlık edin; ileride yüz satırlık dosyalarda hayat kurtarır.
Derle ve çalıştır
Terminalde java-dersleri klasörüne gir (cd java-dersleri) ve iki komut:
javac Merhaba.javajava Merhaba
Gördün mü? İlk komut hiçbir şey yazmadı; Unix dünyasında sessizlik başarı demektir. Ama klasöre ls ile bakınca yeni bir dosya var: Merhaba.class, 327 bayt. Bölüm 1’deki yarı yol dili, bytecode; senin 52 baytlık kaynak kodundan javac’ın ürettiği kargo kolisi. İkinci komut o koliyi JVM’e verdi ve JVM Bölüm 2’de gezdiğimiz her şeyi yaptı: kapıdan aldı, kontrol etti, masaya koydu, main’i çalıştırdı ve ekrana yazdı. Milisaniyeler içinde.
flowchart TD
A["Merhaba.java<br/>senin yazdığın 3 satır"] -->|"javac Merhaba.java"| B["Merhaba.class<br/>bytecode, 327 bayt"]
B -->|"java Merhaba"| C["JVM: yükle, kontrol et, çalıştır"]
C --> D["Ekran: Merhaba, dünya!"]Dikkat: ikinci komutta java Merhaba yazdık, java Merhaba.class değil. java’ya dosya adı değil sınıf adı verilir; uzantıyı eklersen “Could not find or load main class Merhaba.class” hatası alırsın. Buna aşağıda tekrar geleceğiz.
Tek adımda: java Merhaba.java
Java 11’den beri küçük programlar için kısa yol var: derlemeyi ve çalıştırmayı tek komuta sığdırmak.
java Merhaba.java
Bu sefer diskte .class dosyası oluşmadı; java derlemeyi bellekte yaptı, çalıştırdı, unuttu. Denemeler için harika. Ama gerçek projelerde iki adım hep ayrıdır: bir kez derlersin, defalarca çalıştırırsın, .class dosyalarını paketleyip başkasına verirsin. O yüzden ikisini de bilmen gerekiyor.
Klasik hâli: internette göreceğin sürüm
Bölüm 1’de söz vermiştim: internetteki örneklerin, kitapların, Java 21 ve öncesinin “Merhaba, dünya”sı biraz daha uzundur. Onu da yazalım ve aynı şekilde çalıştıralım:
public class Klasik { public static void main(String[] args) { System.out.println("Merhaba, dünya!"); }}
Fazladan kelimelerin her birinin bir anlamı var, ama hepsini bugün öğrenmek zorunda değilsin: public class Klasik “Klasik adında herkese açık bir sınıf” (Bölüm 2’deki kurabiye kalıbı), static “kalıptan kurabiye kesmeden de çağrılabilir”, String[] args “programa dışarıdan verilebilecek kelimeler”. Java 25, ilk program için bunların hiçbirine gerek olmadığına karar verdi ve kısa yazımı standart yaptı; ama uzun yazım da geçerli ve her yerde çalışır. Bir kural farkı: public class Klasik yazdıysan dosyanın adı Klasik.java olmak zorunda. Kısa yazımda böyle bir zorunluluk yok.

Adım 4: jshell, deneme tahtası
Her küçük merak için dosya açıp derlemek yorucu. JDK’nın içinde bunun için bir araç var: jshell, Java 9’la (2017) gelen etkileşimli deneme tahtası. Terminale jshell yaz, bir satır Java yaz, Enter’a bas, sonucu gör.

Ekrandakileri sen de dene:
jshell> 2 + 3$1 ==> 5
jshell> String ad = "Ada";ad ==> "Ada"
jshell> "Merhaba, " + ad$3 ==> "Merhaba, Ada"
jshell> ad.length() * 2$4 ==> 6
jshell> /exitİkinci satıra bak: String ad = "Ada";. Değişkenler yazısındaki posta kutusu, Java’da böyle yazılıyor: kutunun türü (String, metin), adı (ad), içine konan değer ("Ada"). Sözde kodda ad ← "Ada" demiştik; ok yerine eşittir, başına tür. Üçüncü satır iki metni + ile birleştiriyor; dördüncüsü metnin uzunluğunu soruyor ve sayıyla çarpıyor. Kâğıtta yaptığımız her şey burada canlı. jshell’den /exit ile çıkılır; sıradaki bölümde onu bolca kullanacağız.
İlk hata mesajlarını okumak
İlk programını yazarken hata almadıysan ya çok dikkatlisin ya da şanslısın; ikinci programda alacaksın. Sorun değil. Algoritmalar serisinin son yazısında “hata mesajı düşman değil, yol tarifi” demiştik; Java’nın mesajları buna iyi örnek. Aşağıdakilerin hepsini kendi elimle üretip okudum:

| Mesaj | Anlamı ve çözümü |
|---|---|
error: ';' expected | Satırın sonunda noktalı virgül yok. Mesajdaki satır numarasına git, ^ işaretinin gösterdiği yere ; koy. |
error: package system does not exist ya da cannot find symbol | Büyük-küçük harf: system.out yazılmış, System.out olmalı. cannot find symbol genelde yanlış yazılmış bir ad demektir. |
error: ')' or ',' expected | Metni tırnak içine almayı unuttun: IO.println(Merhaba) değil IO.println("Merhaba"). |
error: reached end of file while parsing | Kapanış süslü parantezi } eksik; dosya erken bitti. |
error: class Klasik is public, should be declared in a file named Klasik.java | Klasik yazımda sınıf adı ile dosya adı aynı olmalı. Dosyayı yeniden adlandır ya da sınıf adını değiştir. |
Error: Could not find or load main class Merhaba.class | java Merhaba.class yazdın; java Merhaba olacak. Aynı mesaj, yanlış klasördeysen de gelir: cd ile .class dosyasının olduğu klasöre git. |
error: unnamed classes are a preview feature | Kısa void main() yazımını Java 21 ile derlemeye çalıştın. Ya 25’e geç ya da klasik hâli yaz. |
javac: command not found ya da 'javac' is not recognized | PATH sorunu ya da yalnızca JRE kurulu. Yukarıdaki “Tuzak” ve “PATH” bölümlerine bak; terminali yeniden açmayı unutma. |
Mesajı okumanın tarifi hep aynı: dosya adı, iki nokta, satır numarası, iki nokta, mesaj. Hata.java:2: error: ';' expected diyorsa ikinci satıra bak, altındaki ^ işareti tam yeri gösterir. Mesajı Google’a yazmaktan önce bir kez kendin oku; çoğu zaman cevap içinde.
Kendin dene
Bu bölümün soruları kalem kâğıtla değil, klavyeyle. Ama her birini önce kafanda cevapla, sonra dene; tahmin tutmuyorsa asıl öğrenme orada başlıyor.
Soru 1 — İki satır (kolay)
Merhaba.java’ya ikinci birIO.println("Nasılsın?");satırı ekle. Derleyip çalıştırmadan önce tahmin et: çıktı bir satırda mı iki satırda mı görünür? Pekiprintlnyerine
Soru 2 — Noktayı sil (kolay)
Noktalı virgülü sil,
javac Merhaba.javaçalıştır ve hata mesajını sesli oku: dosya, satır, mesaj, işaret. Sonra geri koy. İki dakikalık bu alıştırma, ileride saatler kazandırır.
Soru 3 — Dosya adı (orta)
Kısa sürümü
merhaba.java(küçük m) adıyla kaydedipjava merhaba.javaile çalıştır. Çalışır mı? Aynı şeyiKlasik.java’yıklasik.javayaparak dene. O da çalışır mı? Neden fark var?
Soru 4 — jshell’de bölme (orta)
jshell’i aç ve şu ikisini yaz:
7 / 2ve7.0 / 2. Sonuçlar farklı. Değişkenler yazısındaki tam sayı ve ondalık sayı ayrımını hatırlayarak nedenini açıkla.
Soru 5 — Hangi Java? (orta)
İş yerinde bir arkadaşın “projede Java 21 kullanıyoruz, sen 25 kurmuşsun, sorun olur mu?” diyor. Ne cevap verirsin? Bilgisayarında ikisi de olabilir mi?
Toparlayalım
Bugün teori yoktu, iş vardı: Java’yı kurdun, ilk programını yazdın, derledin, çalıştırdın, bozdun ve düzelttin. Aşağıdaki listeyi cebine koy; sıradaki bölümlerde hepsini kullanacağız.
Kaynaklar
- Eclipse Temurin indirme ve Adoptium kurulum kılavuzu.
- Red Hat build of OpenJDK: RHEL paketleri ve taşınabilir arşivler; Windows için de yapımlar var.
- OpenJDK projesi ve JDK 25 sürüm sayfası.
- Bu yazıdaki yenilikler: JEP 512, kompakt kaynak dosyaları ve
void main(), JEP 330, tek dosyalık programlarıjavaile çalıştırma, JEP 222, jshell. - dev.java: Oracle’ın ücretsiz öğrenme sitesi; “Getting Started” bölümü bu yazının resmî karşılığı.
- SDKMAN: Linux ve macOS’ta birden çok JDK yönetimi.
- Homebrew temurin@25 ve winget belgeleri.
- “Hello, World!” programının tarihçesi: Kernighan, 1972.
- Ekran görüntüleri: yazarın VirtualBox içindeki RHEL 10.2 sanal makinesinden (Red Hat build of OpenJDK 25.0.4.1); taşınabilir arşiv denemesi yazarın kendi Linux’unda.
İlgili yazılar
Sıkça sorulan sorular
JDK ile JRE arasındaki fark nedir, hangisini kurmalıyım?
JRE (Java Runtime Environment) yalnızca hazır Java programlarını çalıştırır: içinde JVM ve temel kütüphaneler vardır. JDK (Java Development Kit) ise JRE'nin üstüne program yazmak için gereken araçları ekler: derleyici javac, deneme tahtası jshell, bytecode okuyucu javap ve daha fazlası. Program yazacaksan JDK gerekir. Java 11'den beri çoğu dağıtım zaten ayrı bir JRE sunmaz; JDK'yı kurarsın, çalıştırma da içinde gelir.
Hangi Java sürümünü kurmalıyım?
Java 25'i. Java her Mart ve Eylül'de yeni bir sürüm çıkarır, ama bunların yalnızca iki yılda bir çıkanları uzun süre desteklenir (LTS: 17, 21, 25, sıradaki 29). 25, Eylül 2025'te çıkan güncel LTS sürümü; bu seri boyunca onu kullanacağız. Bilgisayarında 21 varsa o da yeter, tek fark Bölüm 1'de gördüğün kısa void main() yazımının 21'de çalışmaması.
Oracle JDK mı, OpenJDK mi? Java ücretsiz mi?
Java'nın kaynak kodu tek: OpenJDK. Oracle, Eclipse (Temurin), Red Hat, Amazon (Corretto), Azul ve Microsoft aynı kaynaktan kendi yapımlarını üretir; hepsi aynı standardı geçer ve hepsi ücretsizdir. Oracle JDK da 17'den beri ücretsiz (NFTC lisansı), ama kurumsal destek isteyenler için ücretli seçenekleri de var. Yeni başlayan biri için en pratik yol Windows ve macOS'ta Eclipse Temurin, Linux'ta dağıtımın paket yöneticisi.
PATH nedir, neden önemli?
Terminale javac yazdığında işletim sistemi bu programı nerede arayacağını bilmek zorunda. PATH, bakılacak klasörlerin sıralı listesidir. Kurulum programı JDK'nın bin klasörünü bu listeye ekler; eklemezse javac yazınca command not found ya da is not recognized hatası alırsın. Windows'ta Temurin kurulum sihirbazı bunu kendisi yapar, macOS ve Linux'ta paket yöneticisi halleder.
javac yazınca command not found ya da is not recognized diyor, ne yapmalıyım?
Üç olası neden var. Birincisi, kurulumdan sonra terminali yeniden açmadın; PATH değişikliği yalnızca yeni açılan pencerelerde geçerli olur. İkincisi, yalnızca çalıştırma paketi kuruldu: Fedora ve RHEL'de java-25-openjdk paketi javac içermez, java-25-openjdk-devel gerekir; Debian ve Ubuntu'da openjdk-25-jre yerine openjdk-25-jdk kurulmalı. Üçüncüsü, PATH'e gerçekten eklenmemiş; which java (Linux, macOS) ya da where java (Windows) ile nerede olduğuna bak.
java -version eski bir sürüm gösteriyor, neden?
Bilgisayarında birden fazla Java var ve PATH'te önce eski olan bulunuyor. macOS'ta /usr/libexec/java_home -V ile kurulu sürümleri görebilirsin; Linux'ta Fedora ve RHEL alternatives --config java ile seçim yaptırır, Debian ve Ubuntu'da update-alternatives --config java. Windows'ta Ortam Değişkenleri penceresinde PATH'teki sıraya bak; yeni JDK'nın bin klasörünü en üste taşı.
Merhaba.class dosyası nedir, silsem ne olur?
javac'ın ürettiği bytecode dosyası; Bölüm 1'de anlattığımız yarı yol dili. java Merhaba komutu bu dosyayı çalıştırır. Silersen hiçbir şey kaybetmezsin, kaynak kodun Merhaba.java'da duruyor; javac'ı tekrar çalıştırınca yeniden üretilir. Projelerde .class dosyaları zaten paylaşılmaz, yalnızca .java dosyaları saklanır.
java Merhaba.java ile javac ve java ikilisi arasındaki fark ne?
java Merhaba.java (Java 11'den beri) derlemeyi bellekte yapıp hemen çalıştırır, diskte .class dosyası bırakmaz; küçük denemeler için idealdir. javac ve java ikilisi ise derlemeyi ve çalıştırmayı ayırır: .class dosyası oluşur, bir kez derleyip defalarca çalıştırabilir, dosyayı başkasına verebilirsin. Gerçek projelerde derleme adımı hep ayrıdır; ileride bu işi Maven ve Gradle gibi araçlar üstlenecek.
jshell nedir, ne işe yarar?
Java 9 ile gelen etkileşimli deneme tahtası. Dosya oluşturmadan, main yazmadan, tek satırlık Java ifadeleri yazıp anında sonucu görürsün: 2 + 3 yazarsın, 5 gelir. Bir metodun ne yaptığını hızlıca denemek, bir sözdizimini hatırlamak ya da öğrenirken oynamak için birebir. Terminale jshell yazarak açılır, /exit ile kapanır.
Program yazmak için IDE (IntelliJ, VS Code) gerekli mi? Hangisini kullanmalıyım?
Şimdilik hayır, hatta özellikle değil. İlk programları düz bir metin editörü ve terminalle yazmak, javac ve java'nın gerçekte ne yaptığını görmeni sağlar; IDE bu adımları gizler. Birkaç bölüm sonra, programlar büyüyünce bir IDE'ye geçeceğiz. Hangisini kullanacağın tamamen sana kalmış: IntelliJ IDEA (Community sürümü ücretsiz), Visual Studio Code, Eclipse ve NetBeans hepsi Java yazar, hepsi ücretsizdir. Ben örneklerde birini gösterebilirim ama sen alışkın olduğun ya da merak ettiğin hangisiyse onu kullanabilirsin; ürettiğin .java dosyası hepsinde aynıdır.