SMALL JAVA PROGRAMS
Başlat -> Çalıştır sekmelerine basınca açılan pencerede Search Programs and
Files: ----- kutucuğuna cmd yazıp entere
basınız.
Başlat -> Tüm Programlar -> Donatılar sekmelerinden sonra açılan alt
pencereden Komut İstemi (Command Prompt) sekmesine tıklayınız.
Windows’un farklı sürümleri için de benzer
işler yapılabilir. Yukarıdakilerden birisini yaptığınız zaman, ekranda siyah
zemin üzerine beyaz yazılar yazılan Komut İstemi (Command Prompt) penceresinin açıldığını
göreceksiniz. Bu pencereye istediğiniz dos komutunu yazabilir ya da
yürütülebilir (executable) herhangi bir programı çalıştırabilirsiniz.
Şimdi yazdığımız programları içine kaydedeceğimiz bir dizin yaratalım.
İstediğiniz sürücüde istediğiniz adla bir dizin ya da alt dizin yaratıp Java programlarınızı
oraya kaydedebilirsiniz. Programlarımızı C: sürücüsünde yaratacağımız jprg dizini içine
kaydetmek isteyelim. Bunun için şu komutları yazacağız:
md C:\jprg
cd C:\jprg
Bunlardan birincisi olan md (make directory)
komutu istediğimiz dizini yaratır. İkincisi olan cd (change directory)
komutu ise o dizini etkin kılar. Basit bir deyişle, sistemin yazma/okuma kafası
o dizin içine girer ve orada yazabilir ve okuyabilir. Dizine girdiğimizi, Komut
İstemi ekranında beliren
C:\jprg>
görüngesinden anlarız. Bu
simgeler daima Komut İstemi penceresinde görünecektir; etkin olan dizini
gösterir. Dos komutlarını c:\jprg> etkin
(prompt) simgesinden hemen sonra yazacağız. Şimdi program yazmamıza yardım
edecek basit bir editör açalım. Komut İstemi penceresinde edit yazıp Enter tuşuna basınız:
edit
Eğer editör penceresi açılmazsa,
sisteminiz edit.com dosyasını görecek biçimde ayarlı değildir. Bunu PATH çevre değişkeni
ile ayarlayabilirsiniz. Ama, şimdi zaman kaybetmemek için, edit.com dosyasının
bulunduğu adresi tam yazarak, editörü açabiliriz:
C:\WINDOWS\system32\edit
Açılan editörde aşağıdaki programı
yazıp Dosya sekmesinden Farklı Kaydet seçeneğine
basınız. Açılan alt pencerede Dosya Adı yerine Program001.java yazıp Enter tuşuna basınız.
İsterseniz yazma ve kaydetme işini Notepad ile de yapabilirsiniz.
Program001.java
class Program001
{
}
İpucu
Java kaynak programlarının dosya adlarının uzantısı .java olmalıdır.
Programa verilen dosya adı ile programda tanımlanan class adı aynı olmalıdır.
Tabii, bir programda birden çok class olabilir. Burada
söylenen şey, programdaki iç sınıfların hepsini içeren en dıştaki class’ın adı ile dosya adının aynı olması gereğidir. Bunun nasıl yapıldığını
ilerideki örneklerimizde daima göreceğiz.
Java nesne yönelimli bir dil
olduğu için, hemen her şey sınıflar (class) içine yazılır. Programda
kullanacağımız değişkenler ve metotlar mutlaka bir ya da birden çok
sınıf içinde tanımlanmalıdır. Bunların nasıl olacağı, bu dersin asıl
konusudur ve onları adım adım öğreneceğiz.
Yukarıda yazdığımız Program001.java dosyası için
tanımlanan Program001 sınıfının içi boştur. Dolayısıyla, bu sınıfın hiçbir iş yapmayacağı
açıktır. Böyle olduğunu birazdan göreceğiz. javac.exe derleyicisi
ile programı derlemek için
javac Program001.java
yazıp Enter tuşuna basınız. Eğer
sisteminiz javac.exe derleyicisini görmüyorsa,
derleyicinin bulunduğu adresi yazabilirsiniz.
C:\jdk\bin\javac Program001.java
Derleyici Program001.class adlı bytecode dosyasını
yaratacaktır. (Bunu görmek için DOS kipinde dir komutunu
çalıştırınız.)
Şimdi Program001.class dosyasını
yorumlamak (yürütmek, icra) için java.exe yorumlayıcısını
kullanacağız:
java
Program001
Yorumlayıcı bize
aşağıdaki iletileri gönderecektir.
C:\jprg\src>javac Program001.java
C:\jprg\src>java Program001
Exception in thread "main" java.lang.NoClassDefFoundError:
Program001
Caused by: java.lang.ClassNotFoundException: Program001
at
java.net.URLClassLoader$1.run(Unknown Source)
at
java.security.AccessController.doPrivileged(Native Method)
at
java.net.URLClassLoader.findClass(Unknown Source)
at
java.lang.ClassLoader.loadClass(Unknown Source)
at
sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at
java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: Program001. Program will exit.
C:\jprg\src>
Bu iletinin ilk
satırı javac.exe derleyicisinin Program001.java dosyasının derlemesi için verdiğimiz komuttur. Derleyici bu komuta
karşılık bir hata olduğu iletisi göndermemiştir. O halde Program001.class adlı bytecode dosyasının yaratıldığını anlayacağız.
İkinci satır java.exe yorumlayıcısının Program001.class bytecode’unun
yorumlaması (yürütülmesi) için verilen komuttur. Bu komuttan sonra gelen
iletiler, komutun yürütülemediğini ve yürütülemeyiş nedenlerini açıklayan
satırlardır.
Üçüncü satır, java.exe yorumlayıcısının
programı yürütmek için gerekli olan main() metodunu bulamadığını
söylüyor.
Programın yürütülemeyiş
nedeni, üçüncü satırdaki ileti ile bildirilmektedir. Ondan sonraki satırları
şimdilik düşünmeyiniz. Onlar, yorumlayıcının kendi iç işlevlerini ilgilendiren
şeylerdir.
İpucu
Derleyici kaynak
programda sözdizimi (syntax) hatası olduğunda programı derleyemez. Derleyici,
derleyemediği her programda, sözdizimi yanlışlarını satır numarası yanında
olası hatanın ne olduğunu yazarak bize iletir. Bu iletiler,
programın düzeltilmesinde (debug) çok işe yararlar.
Ama, şimdilik bunları hiç düşünmeden,
derleyicinin bizden istediği giriş noktasını oluşturmaya çalışalım.
Java uygulamaları bir main() metodu (fonksiyon) tarafından eyleme geçirilir. Programın yapacağı bütün
işler bu main() metodu tarafından belirlenir. Buna
programın giriş noktası diyoruz. Şimdi yukarıdaki programımıza main()metodunu ekleyelim ve Program002.java adıyla kaydedelim.
Program002.java
class Program002
{
public static void main(String[] args)
{
}
}
Sonra programı derleyelim:
javac
Program002.java
Derleyicimiz gene hiç hata (error) iletisi göndermedi.
Demek ki programı derledi ve yürütülebilir bytecode’a çevirdi. Gerçekten Dos
kipinde
dir
komutu verirseniz, c:\jprg dizini
içinde Program002.class adlı bytecode dosyasını göreceksiniz. Bu dosyayı
yorumlamak için
java
Program002
komutunu yazmanız yetecektir. Bunu
yazdığınızda, program çalışır, ama siz ekranda bir şey göremezsiniz. Çünkü,
programın içine ekrana çıkacak bir şey yazmadık. Şimdi bunu yapalım.
İpucu
Bir dili öğrenirken
işin pedagojisi ile sistematiği asla paralel gitmez. Bu nedenle, bazen
pedagojiden bazen sistematikten ödün vermek gerekir. Böyle durumlarda, görünmez
uzaylı dostumuz Uzay bize ipucu verecektir. Şimdilik Uzay’ın bize verdiği
ipuçlarını kullanalım. Zamanla, onları daha iyi kavrayacağız.
İpucu
Ekrana bir şey
yazdırmak için System.out.print() ya da System.out.println() metotları kullanılır. İkisi de aynı işi yapar, ancak birincisi
isteneni yazdıktan sonra, yazdığı satırın sonunda bekler, ikincisi isteneni
yazdıktan sonra satırbaşı yapar; yani alttaki satırın başına geçer.
Şimdi bu ipucuna göre programımızı
düzeltelim.
Program003.java
class Program003
{
public static void main(String[] args)
{
System.out.println("Merhaba Java!
")
}
}
Bu programı kaydettikten sonra derleyelim:
javac Program003.java
Bu kez, Komut istemi penceresinde şunu
göreceğiz:
C:\jprg\src>javac Program003.java
Program003.java:5: ';' expected
System.out.println("Merhaba
Java! ")
^
1 error
Bu iletinin ikinci satırı kaynak programın
5-inci satırında hata olduğunu, hatanın ‘;’ simgesinin yokluğu olduğunu söyler.
Üçüncü satırda ise hatanın yeri (^) simgesi ile işaret edilmektedir.
İpucu
Java dilinde her
deyimin sonuna (;) konulur.
Derleyicinin hata
iletisi kesinlikle kaynak programda bir hata olduğunun belirtir. Tabii her
programcının yaptığı hatayı tam belirleyemeyebilir. Ama kaynak programdaki
hatayı kategorik olarak bildirir ve yerini doğru işaret eder. O nedenle, hatayı
işaret edilen yerde aramalıyız.
Şimdi eksik olan (;) yazarak
programımızı düzeltelim (bu işleme ‘debug’ denir).
Program004.java
class Program004
{
public static void main(String[] args)
{
System.out.println("Merhaba Java!
");
}
}
Bu programı Program004.java adıyla kaydedelim ve
derleyelim:
javac
Program004.java
Derleyicimiz başka bir hata iletisi
göndermez. Öyleyse yorumlanabilir bytecode dosyasını yaratmıştır.
Gerçekten
dir
komutunu yazarsak, C:\jprg dizininde Program004.class bytecode
dosyasının yaratıldığını görebiliriz. Şimdi bu dosyayı koşturmak için,
Program004
yazıp Enter tuşuna basarsak, ekranda
Merhaba Java!
yazısını göreceğiz.
Buraya kadar dört adımda ekrana ‘Merhaba Java!’ tümcesini
yazdıran bir program yazdık. Bu bir tümce yerine bir roman ya da karmaşık
matematiksel işlemlerden oluşan deyimler de olabilirdi. Uzun ya da kısa
metinler veya basit ya da zor işlemler için yapacağımız iş hep budur. Bu
biçimde yazacağımız küçük programlarla Java dilinin bütün hünerlerini
öğreneceğiz. Büyük programların bu küçük programların uyumlu birleşmesinden
oluştuğunu hiç aklımızdan çıkarmayalım. O nedenle, bütünleşik bir
uygulama geliştirme aracını (IDE) kullanmaya başlamadan, Java dilinin
temellerini öğrenmeye devam edeceğiz.
Kaynak
Programın Biçemi
Programlama dillerinde, belirli bir işi
yapmak üzere yazılan sözdizimi (kod) parçasına deyim denir. Örneğin,
System.out.println("Merhaba
Java ");
bir deyimdir. Java dilinde bir deyimin
bittiğini derleyiciye bildirmek için, o deyimin sonuna (;) konulur. Bir
deyimdeki farklı sözcükler birbirlerinden en az bir boşluk karakteri ile
ayrılır. Kaynak programda ardışık yazılan birden çok boşluk karakterleri tek
boşluk olarak algılanır. Benzer olarak, tablar, satırbaşları ve boş satırlar
birer boşluk karakteri olarak yorumlanır. Dolayısıyla, yukarıdaki programı
Program004a.java
class Program004a
{ public
static void main(String[] args) {System.out.println("Merhaba Java! );}}
biçiminde ya da
Program004b.java
class
Program004b
{
Public
static
void
main()
{
System.out.println("Merhaba
Java! ");
}
}
biçiminde de yazabiliriz. Derleyici,
kaynak programı derlerken birden çok tekrar eden boşluk karakterlerini, tab ve
satırbaşlarını birer boşluk karakteri sayacaktır.
Buraya kadar Java diline ait bazı
kavramları açıklamadan kullandık. Bu noktada basit açıklamalar yapmak yararlı
olabilir.
Sınıf
(class)
Sınıflar (class) Nesne Yönelimli
Programlamanın (Object Oriented Programming) temel taşlarıdır. Programın
kullanacağı her değişken, her deyim, her metot (fonksiyon) mutlaka bir sınıf
içinde tanımlanmalıdır. Bir sınıf içinde tanımlanan metotlar (fonksiyonlar) ve
değişkenler o sınıfın öğe'leridir (member).
Karışmamaları için, bir sınıfta aynı adı taşıyan iki öğe olamaz (aşkın öğeler
kavramını ileride göreceğiz).
Bloklar
Kaynak program bir ya da bir çok sınıftan
oluşur. Sınıfların her biri bir bloktur. Bir sınıf içindeki her metot
(fonksiyon) bir bloktur. Örneğin, yukarıdaki programın tamamından oluşan
class
Program004
{
}
bir bloktur. Benzer olarak,
public
static void main(String[] args)
{
}
metodu da bir bloktur. main(){ } bloku, class Program004.java{ } blokunun
içindedir. Bu tür bloklara iç-içe bloklar diyoruz. Bir
blok içinde gerektiği kadar iç-içe bloklar oluşturabiliriz. Bir programda
birden çok sınıf ve bir sınıf içinde birden çok blok olabilir. Bloklar, adına
blok parantezleri diyeceğimiz { } simgeleri içine yazılır. Bazan main(){ } blokunda olduğu
gibi blok parantezlerinin önüne blok adı gelebilir. Her sınıf (class) ve her
alt sınıf bir bloktur. Bir sınıf içinde yer alan her metot (fonksiyon) bir
bloktur. İleride göreceğimiz if,
case ve döngü yapılarının her birisi bir bloktur. Bir sınıf içinde birbirlerinden
bağımsız bloklar seçkisiz sırada alt-alta yazılabilir. Ancak iç-içe olan
bloklar, istenen işlem sırasını izleyecek uygun sırayla iç-içe konur. İç-içe
blok yazılırken, en içten dışa doğru blokun başladığı ve bittiği yerleri
belirten blok parantezlerinin ({ }) birbirlerini karşılaması sağlanmalıdır. Bu
yapılmazsa derleme hatası doğar. İç-içe bloklarda, işlem öncelikleri en içten
en dışa doğru sıralanır.
Derleyici kaynak programın biçemine
(format) değil, sözdizimine bakar. Ama kaynak programı hem kendimiz hem de
başka programcılar için kolay okunur biçimde yazmak iyi bir alışkanlıktır.
İç-içe giren blokları birer tab içeriye almak, alt-alta yazılan
bloklar arasına birer boş satır koymak, kaynak programın, programcı tarafından
kolay okunup anlaşılmasını sağlar. Özellikle, uzun programlarda düzeltme
(debug) ya da güncelleme (update) yaparken, kaynak programın yazılış biçemi
işin kolay ya da zor yapılmasına neden olur.
Programa
Açıklama Ekleme
Kaynak programımızın biçemi bilgisayar
için değil, onu okuyan kişiler için önemlidir, demiştik. Büyük bir programın
kaynağının kolay anlaşılır olmasını sağlamak programcının ahlâki
sorumluluğundadır. Bunu sağlamak yalnızca programın biçemiyle olmaz. Büyük
programlar için sınıfların, metotların, değişkenlerin işlevleri ayrıca
açıklanmalıdır. Büyük yazılım firmaları programdaki her ayrıntıyı açıklayan
döküman hazırlarlar. Böylece, yıllar sonra programcılar değişse bile, o
dökümanlara bakılarak, kaynak program üzerinde değişiklikler, iyileştirmeler
yapılabilir.
Java dilinde programa açıklama eklemek
için iki yöntem kullanırız. Bu yöntemler C, C++ ve java gibi bir çok dilde
de var olan yöntemlerdir.
Tek
satır açıklaması
// simgesinden sonra satır sonuna kadar
yazılanlar derleyici tarafından işlenmez. Bir satırın bütününü ya da bir
satırın ortasından sonuna kadar olan kısmı açıklamaya koyabiliriz:
// Bu metot net ücretten gelir vergisini hesaplar
Birincide satırın tamamı bir
açıklamadır. Örneğin, gelir vergisi hesaplayan bir metodun başladığı
satırdan önceki satıra konulabilir, böylece metodun ne iş yaptığı her okuyan
tarafından anlaşılır.
İkincide, genellikle program yazarken bazı
deyimlerin programa konulup konulmamasının etkisini görmek için, programcının
sık sık başvurduğu bir yöntemdir. Bir deyimin başına // simgelerini
koyarak o deyimi derleyicinin görmesini engelleyebilirsiniz.
Üçüncüde, önce bir deyim yazılmış, deyimin
bittiği yerde // simgesi konulmuştur. Derleyici deyimi görür ve işler, ama //
simgesinden sonra satır sonuna kadar yazılanları görmez. Bu yöntemle, bir
deyimin ne iş yaptığını kolayca açıklayabiliriz.
Çoklu
satır açıklaması
Bazan yapacağımız açıklama tek satıra
sığmayabilir. O zaman ardışık açıklama satırlarını
/* */ simgeleri arasına alırız.
/*
Bu sınıf 20 Ağustos 2008 tarihinde
Java ile Nesne Programlama
kitabının Onikinci Bölümü için yazılmıştır.
*/
Bu yöntem çok satırlı açıklamalar için
kullanıldığı gibi, program yazarken ardışık satırlardan oluşan bir blokun, bir
metodun, bir sınıfın programda olup olmamasının etkisini görmek için
programcının geçici olarak başvurduğu önemli bir araçtır.