Java 25 Unnamed Classes ve Instance Main Methods, küçük bir Java programında açık class bildirimi ile public static void main(String[] args) kalıbının bir bölümünü kaldırır. Kaynak dosyasına doğrudan alan ve metot yazabilir, void main() gibi bir instance main method kullanabilir ve Java’nın bu üyeleri örtük olarak bildirilen bir sınıfın parçası kabul etmesini sağlayabilirsin.
Java SE 25’te bu yaklaşım artık preview değil, Compact Source Files and Instance main Methods adıyla kalıcı bir dil özelliğidir. Bu nedenle Java 25 ile kullanırken preview özelliğini etkinleştiren ek bir seçenek gerekmez. Yine de bu yazım biçimi her Java projesi için zorunlu değildir; özellikle küçük ve tek dosyalı programlarda kullanılan bir sadeleştirme seçeneğidir.
Küçük Java programlarında sınıf ve giriş kodu nasıl sadeleşir?
Geleneksel bir Java başlangıç programında sınıf adını, sınıf gövdesini, public erişim belirtecini, static değiştiricisini ve String[] parametresini birlikte yazarsın. Java 25’in kompakt kaynak dosyaları bu başlangıç kodunun bir kısmını görünmez hâle getirir. Böylece değişkenler, kontrol akışı ve metotlar üzerinde çalışırken sınıf bildiriminin ayrıntıları daha sonraki aşamalara bırakılabilir.
Terimler arasındaki ayrım önemlidir. Unnamed Classes and Instance Main Methods, özelliğin önceki preview dönemindeki adlandırmasıdır. Java SE 25’te resmî başlık Compact Source Files and Instance main Methods olarak değiştirilmiştir. Java Dil Şartnamesi, bu kaynak dosyasının içindeki açık sınıf gövdesi dışında kalan üyelerden oluşan yapıyı implicitly declared class, yani örtük olarak bildirilen sınıf olarak tanımlar. Bu sınıfı içeren kaynak dosyası ise Oracle belgelerinde compact source file, şartnamede sözdizimsel olarak compact compilation unit şeklinde geçer.
Unnamed class yazımının temel biçimi nasıl kurulur?

En küçük biçimde kaynak dosyası, açık bir sınıf bildirimiyle başlamaz. Alan ve metot bildirimleri doğrudan dosyada yer alır:
String mesaj = "Merhaba";
void main() {
System.out.println(mesaj);
}
Beklenen çıktı:
Merhaba
Buradaki mesaj alanı ve main metodu, derleyici tarafından örtük olarak bildirilen sınıfın üyeleri kabul edilir. main bildiriminde static bulunmadığı için bu metot bir instance metottur. Açık sınıf adı kaynakta görünmez. Java Dil Şartnamesi’ne göre örtük sınıfın adı ana bilgisayar sistemi tarafından belirlenir ve dosya adıyla eşleştirilmesi tipik bir uygulama ayrıntısıdır; bu ad, kaynak kod içinde sınıfı doğrudan kullanmak için yazılamaz.
import bildirimleri üyelerden önce yazılabilir. package bildirimi ise bu biçimin parçası değildir; örtük sınıf adsız pakette bulunur. Ayrıca kompakt kaynak dosyaları, java.base modülünün dışa aktardığı paketlerdeki public üst düzey sınıf ve arayüzleri isteğe bağlı olarak içe aktarılmış kabul eder.
Bu yapıda alanlar, metotlar, iç içe sınıflar ve iç içe arayüzler tanımlanabilir; kaynak dosyasında en az bir metot bulunmalıdır. Açık bir constructor ya da instance ve static initializer bloğu yazılamaz. Örtük sınıfın parametresiz varsayılan constructor’ı vardır. Aynı dosyada yazılan sınıf ve arayüz bildirimleri yeni üst düzey yapılar değil, örtük sınıfın üye türleridir. Temel sınıf, metot ve giriş noktası kavramlarını pekiştirmek için Java bilgi testini çözebilirsin.
Instance main method ile ilk çalışan program nasıl yazılır?
Java SE 25'te en kısa çalıştırılabilir instance main bildirimi void main() biçimindedir. Bu kullanımda public, static ve String[] yazmak zorunlu değildir. Özellik, Java SE 25'te kalıcı dil özellikleri arasındadır.
void main() {
System.out.println("Merhaba, Java!");
}
Beklenen çıktı:
Merhaba, Java!
Kodu satır satır okuyalım. void, giriş metodunun değer döndürmediğini belirtir. main, Java başlatma protokolünün aradığı özel addır. Boş parantez, metodun parametre almadığını gösterir. static yazılmadığı için bu metot bir instance metottur. Kaynak dosyasında açık bir class bildirimi bulunmasa da Java, dosyadaki metotları içeren örtük bir üst düzey sınıf bildirir. Bu sınıfın varsayılan parametresiz yapıcısı kullanılarak bir nesne oluşturulur ve main bu nesne üzerinde çağrılır.
Geleneksel yapıdaki public static void main(String[] args) metodu sınıf üzerinden doğrudan çağrılır. Instance main yaklaşımında ise giriş noktası bir nesnenin metodudur. Bu fark yalnızca birkaç karakterin silinmesi anlamına gelmez: programın başlangıcında nesne oluşturma ve instance metot kavramı da devreye girer. Böylece aynı nesneye ait alan ve metotlar, başlangıç kodunda static yapılmadan kullanılabilir.
- Geçerli aday metodun adı
main, dönüş türüvoidolmalıdır. - Metot instance veya
staticolabilir; erişim düzeyipublic,protectedya da paket erişimi olabilir. - Metot ya parametresiz olmalı ya da tek bir
String[]veya eşdeğerString...parametresi almalıdır.
Hem parametreli hem parametresiz aday varsa tek String[] parametresi alan biçim önce seçilir. Instance biçim seçildiğinde sınıf başlatılır, ardından parametresiz yapıcıyla nesne oluşturulur ve giriş metodu bu nesne üzerinde çalıştırılır.
Parametre alan main, değişken ve metot nasıl birlikte kullanılır?

Instance main metodu komut satırından gelen değerleri String[] args dizisiyle alabilir. Compact source file içinde açık sınıf gövdesi yazılmadan alan ve metot tanımları yapılabilir; bu bildirimler örtük sınıfın üyeleri olarak değerlendirilir.
String selamlama = "Merhaba";
String selamla(String ad) {
return selamlama + ", " + ad + "!";
}
void main(String[] args) {
String ad = args[0];
String mesaj = selamla(ad);
System.out.println(mesaj);
}
Tek komut satırı girdisi: Deniz
Beklenen çıktı:
Merhaba, Deniz!
Java başlatıcısı, komut satırındaki her girdiyi args dizisinin bir elemanı olarak aktarır. Bu örnekte args[0] değeri ad adlı yerel değişkene atanır. selamla(ad) çağrısı, instance main metodu içinden yapıldığı için örtük olarak this.selamla(ad) anlamına gelir. Yani çağrı, main metodunun çalıştığı aynı nesne bağlamındaki instance metodu kullanır. selamlama alanı da bu nesnenin alanıdır ve metot tarafından doğrudan okunur. Parametre verilmeden çalıştırılan bir programda ise args[0] yerine önce args.length kontrolü yapılmalıdır.
Unnamed class için dosya, derleme ve çalıştırma kuralları nelerdir?
Başlıkta unnamed class diye anılan yapı, Java SE 25 belgelerinde compact source file ve implicitly declared class adlarıyla açıklanır. Dosya adı, üretilen sınıf dosyası, giriş noktası ve classpath ilişkisini şu kontrol listesiyle doğrulayabilirsin.
- Dosya adını ve uzantıyı kontrol et:
javackaynak dosyasında.javauzantısı bekler. Açık bir sınıf bildirimi olmadığı için sınıf adı, dosyanın uzantısız adına göre host tarafından belirlenir. Bu nedenle basit bir dosya tabanlı uygulamadaHelloWorld.javaderleninceHelloWorld.classoluşur vejava HelloWorldile çalıştırılır. Bu,public classadı eşleştirme kuralı değildir. - Kaynak biriminin sınırlarını kontrol et: Başta
importbildirimleri bulunabilir, ardından sınıf üyesi bildirimleri gelir.packagebildirimi kullanılmaz; örtük sınıf unnamed package içinde yer alır.java.basetarafından dışa aktarılan türler otomatik kapsama alınır, diğer bağımlılıklar için normal import ve classpath kuralları geçerlidir. Örtük sınıf adlandırılamadığı için doğrudannewile üretilemez; ayrıca compact dosyada constructor veya initializer bildirimi bulunmaz. - Derleme yolunu seç: Kaynağı doğrudan çalıştırmak için
java HelloWorld.javakullanılır. Kalıcı çıktı almak içinjavac -d out HelloWorld.java, ardındanjava --class-path out HelloWorldçalıştırılır. Source-file mode kaynağı bellekte derleyerek yürütür. Dosyanın.javauzantısı yoksa source-file mode için--sourceseçeneği gerekir. - Giriş noktasını ve argümanları kontrol et: Erişilebilir
void main(String[] args)seçilir, yoksa erişilebilirvoid main()aranır. Dosya veya sınıf adından sonra verilen değerler parametreli biçimdeargsdizisine aktarılır. Örneğinjava HelloWorld.java Adaçağrısında ilk değerAdaolur. - Hata durumunu daralt: Java 25 sözdizimini destekleyen bir JDK kullandığını, çalıştırılabilir bir
mainbulunduğunu ve derlenmiş çalıştırmada classpath'inoutdizinini gösterdiğini kontrol et. Bu özellik Java SE 25'te kalıcıdır, yalnızca compact source file ve instance main kullanımı için--enable-previewgerekmez. Paketli, çok dosyalı, özel constructor'lı veya dışarıdan adıyla kullanılacak bir yapı gerekiyorsa açık sınıf bildirimi daha uygun olabilir.
Geleneksel static main ile yeni biçim arasında nasıl seçim yapılır?
İki biçim de aynı Java dilinin parçasıdır. Fark, sınıf bildirimini ne kadar erken görünür kılmak ve giriş noktasının nesneyle nasıl ilişkilendirileceğini açıkça göstermektir.
| kod yapısı | giriş noktası | uygun kullanım bağlamı |
|---|---|---|
public class App içinde public static void main(String[] args) |
static main, nesne oluşturulmadan çağrılır. |
Paket, çok dosya, açık sınıf sınırları ve büyüyen projeler. |
Sınıf dışına yazılan üyeler, örtük sınıf ve void main() |
Instance main seçilirse örtük sınıfın varsayılan nesnesi oluşturulur. | Tek dosyalı denemeler ve küçük bağımsız programlar. |
Bağlantıyı şöyle kurabilirsin: sınıf, nesnelerin şablonudur; instance metot bir nesne üzerinden çalışır; main ise başlatıcının aradığı giriş noktasıdır. Geleneksel yapıda giriş noktası static olduğu için nesne oluşturulmadan çağrılır. Yeni biçimde instance main seçilirse Java önce örtük sınıfın varsayılan nesnesini oluşturur, sonra metodu bu nesne üzerinde çalıştırır. Sınıf ve nesne ilişkisini uygulamayla pekiştirmek için birebir Java özel ders programı içindeki kavramları bu ayrım üzerinden değerlendirebilirsin.
- Program tek dosyalı bir deneme mi? Evetse yeni biçim, sınıf sarmalayıcısını azaltarak kodu daha doğrudan gösterebilir.
- Sınıf ve nesne ilişkisini açıkça göstermek gerekiyor mu? Evetse geleneksel yapı, nesnenin nerede üretildiğini ve üyelerin hangi sınıfa ait olduğunu daha görünür kılar.
- Dosya büyüdükçe ekip organizasyonu ve araç uyumluluğu hangi biçimi daha anlaşılır kılıyor? Açık paket ve sınıf sınırlarına ihtiyaç varsa geleneksel yapı; bağımsız ve küçük kalan dosyalarda yeni biçim tercih edilebilir.
Yeni biçim her projede gerekli değildir. Öğretim, paylaşım veya büyüyen proje ihtiyaçlarında geleneksel yapı; kısa ve tek dosyalı çalışmalarda ise compact biçim koşula göre kullanılabilir.
Sık Sorulan Sorular
Unnamed class ile instance main method aynı şey midir?
Hayır. Unnamed class, sınıf bildiriminin örtük oluşturulmasını; instance main ise main metodunun static olmadan çalıştırılabilmesini anlatır. Aynı dosyada birlikte kullanılabilirler, ancak farklı kavramlardır.
Instance main method kullanırken static anahtar sözcüğü tamamen kaldırılır mı?
Hayır. Yalnızca giriş metodunun static olması zorunlu değildir. Örtük sınıfta static alanlar ve metotlar yine tanımlanabilir.
Unnamed class kullanan Java dosyasının adı nasıl belirlenir?
Dosyanın uzantısız adı pratikte sınıf adı olarak kullanılır. Örneğin HelloWorld.java için HelloWorld.class oluşur ve derlenmiş program java HelloWorld ile başlatılır.
Bu özellik Java SE 25'te kalıcı mı, yoksa önizleme olarak mı kullanılmalıdır?
Java SE 25'te kalıcı özelliktir. Önceki sürümlerdeki preview geçmişinden farklı olarak bu kullanım için --enable-preview gerekmez.
Yeni biçim ne zaman geleneksel sınıf ve main yapısına dönüştürülmelidir?
Paketli çok dosyalı yapı, özel constructor, dışarıdan kullanılacak API, ekip çalışması veya araç uyumluluğu önem kazandığında açık sınıf yapısına geçmek daha anlaşılır olabilir.
Küçük bir programda sade biçimi kullanabilir, kapsam ve organizasyon ihtiyacı arttığında geleneksel sınıf yapısına geçebilirsin.