Java Programlama Diline Giriş ● ● ● ● Amaç: Kullanacağımız Java Development Kit 1.1.6 ortamında, Java pogramlarının nasıl hazırlanacağı öğretilecektir. Basit Java program örnekleri ile Java programlarının yapısı öğrenciye tanıtılacaktır. Bu çerçevede Java dilinde bulunan iki değişik program yapısı olan konsol uygulamaları (console applications) ve appletler (applets) anlatılacaktır. Java Programlarının Hazırlanması ● ● ● ● Yazacağımız her Java programı ya bir konsol uygulaması ya da bir applet olacaktır. Bir applet programı Netscape gibi bir web-browser ya da kullanacağımız Java Development Kit (JDK) ortamında da bulunan ve basit bir web-browser görevini yapan bir appletviewer ile çalıştırılır. Bir konsol uygulaması diğer program dillerinde yazılan programlarına benzer ve bir webbrowser dışında çalıştırılır. Yazacağımız Java programı hangi tür olursa olsun, programı hazırlamak için aşağıdaki aşamalardan geçmemiz gerekecektir: Kurgulama (Editing) Derleme (Compiling) Çalıştırma (Executing) Kurgulama ● Yaratacağımız Java programını bir editör yardımı ile bir kütüğün içine koymalıyız. Kullanacağımız editör vi, emacs, MS editör ya da notepad gibi bir kütüğü ASCII text olarak yaratabilecek olan bir editör olmalıdır (MS-Word, WordPerfect gibi yazılımlar kullanılmamalıdır). Yaratılan kütüğün adı .java eki ile bitmelidir. Bu ek o kütüğün bir Java programı sakladığını gösterir. Örneğin, kütük adları Test1.java ve Test2.java bir Java programı saklayan kütüklerin adları olabilir. Her Java programını saklayan kütük bir Java sınıfını (class) tanımlayacaktır. Bir sınıfın adı onu saklayan kütüğün adıyla aynı olmak zorundadır. Java büyük ve küçük harf ayrımı yaptığından, eğer sınıf adında büyük harf kullanıldıysa kütük adında da büyük harf kullanılmalıdır. Örneğin, test1 ve Test1 Java tarafından iki farklı ad olarak görülecektir. Derleme ● Bir editör yardımı ile bir Java programını saklayan Test1.java kütüğünü yaratmış olduğumuzu varsayalım. İkinci adım, bu kütüğü Java derleyicisiyle derlemektir. Bir başka deyişle, yüksek seviyeli dille yazılan programımızı, bir ara dile (Java byte code) çevirmemiz gerekmektedir. Bu amaçla JDK içindeki javac programını kullanarak komut ortamında (DOS ya da UNIX ortamında) örnek Java programımızı aşağıdaki komutu vererek derleriz: javac Test1.java Eğer yazdığımız programda hiçbir yazım hatası yoksa, bu komut Test1.class kütüğünü yaratacaktır. Eğer programımızda yazım hataları varsa, .class kütüğü üretilmeyecek ve javac programı, programımızdaki hataları, hata mesajları ile bize bildirecektir. Bu durumda programımızdaki hataları bulup hataya neden olan yerleri bir editör yardımıyla düzeltmeliyiz. Düzeltmeleri yaptıktan sonra, programımızı yeniden derlemeliyiz. Bu işe programımızdaki bütün yazım hataları temizlenene kadar devam etmeliyiz. Hatasız programlar için yaratılan .class kütüğü yazdığımız Java programının bir ara-dil olan Javabytecode türünden gösterimidir. Bir başka deyişle, javac programı bizim Java programlama dili kullanarak yazdığımız komutları Java-bytecode olarak bilinen dildeki komutlara çevirir. Java-bytecode dilinin komutları hiçbir makinaya bağlı olmadığından aynı kod değişik ortamlarda ve makinalarda çalıştırılabilir. Çalıştıracağımız program, bu .class kütüğündeki program olacaktır. Çalıştırma ● ● ● Eğer yazdığımız Java programı bir konsol uygulaması ise, örnek programımız için yaratılan ve Java byte kodlarını tutan Test1.class kütüğünü JDK'nın içinde bulunan Java yorumlayıcısı java ile aşağıdaki komutu kullanarak çalıştırabiliriz: java Test1 Eğer programımız bir applet ise, bu applet için ilk önce bir HTML kütüğü yaratmalıyız. Bu HTML kütüğünün adı, genelde programı saklayan kütükle aynı olmalıdır; yalnızca eki .html olacaktır. Bu HTML kütüğünün içinden yaratılmış appleti saklayan .class kütüğüne referans olacaktır. Yaratılan bu appleti JDK'nın içinde bulunan ve basit bir web-browser olan appletviewer programı ile çalıştırabiliriz. Örnek programımızı, appletviewer Test1.html komutuyla çalıştırmak gerekir. Böylece Test1.html kütüğü appletviewer tarafından yüklenecek ve onun içindeki referans sayesinde Test1.class içinde bulunan applet çalıştırılacaktır. Basit Bir Konsol Uygulama Programı ● Bu bölümde basit bir konsol uygulama programının yapısını inceleyeceğiz. Şekil 2.1'de verilen uygulama programı bir editör yardımı ile AnaApplication.java kütüğünün içine konduktan sonra, javac AnaApplication.java komutuyla derlenir ve bu derleme sonucunda AnaApplication.class kütüğü yaratılır. Bu Java byte kodlarını saklayan kütük, java AnaApplication komutuyla çalıştırılır. AnaApplication.java 1 import java.io.*; 2 3 public class AnaApplication { 4 5 public static void main(String args[]) throws IOException { 6 7 String yourName; 8 9 // Klavye ile ozdeslenen System.in akisini kullanacak olan 10 // yeni bir BufferedReader nesnesi yarat 11 BufferedReader stdin = 12 new BufferedReader(new InputStreamReader(System.in)); 13 14 // prompti bastir 15 System.out.print("Adinizi girin ve enter tusununa basin > "); 16 System.out.flush(); 17 18 // adin okunmasi 19 yourName = stdin.readLine(); 20 21 // okunan adin Merhaba kelimesi ile birlikte yazilmasi 22 System.out.println("Merhaba " + yourName); 23 } 24 } ● ● ● Her Java programı bir sınıftan ve her sınıf da bir ya da daha fazla işlevden oluşur. Java sisteminde daha önceden tanımlanmış birçok sınıf vardır. Bu sınıflardaki işlevlere bizim yazacağımız programlardan erişebiliriz. Java sistemindeki sınıflar da gruplanan paketlere konmuştur. Bir paket birden fazla sınıf kapsayabilir. Her sınıf, işlevlerine ek olarak o sınıfın bir nesnesini yaratabilen özel bir işlevi ve o sınıfın değişkenlerini içerebilir. Örnekteki konsol uygulama programında '//' ile başlayan satırlar açıklama satırlarıdır. Programlama açısından hiçbir önemi olmayan bu satırlar yalnızca programı açıklamak için kullandığımız bilgileri kapsar. Java derleyicisi bir satırın '//' ile başlayan ve satırın sonuna kadar devam eden bölümünü açıklama olarak görür ( NOT: Programda satırbaşlarındaki numaralar açıklama yapabilmek amacıyla konulmuştur, ve programımızın bir parçası değildir). Programımızın içinde, kodun okunmasını kolaylaştırmak için, istediğimiz kadar boş satır kullanabiliriz. Java derleyicisi bu boş satırları gözönüne almaz. ● Programın 3. satırdan 24. satıra kadar olan bölümü bir sınıf tanımlar. 11. satır sınıfımızın adının AnaApplication olacağını ve o satırdaki public kelimesi de bu sınıfın dışarıdan (yani başka sınıflardan) erişilebileceğini gösterir. Bu sınıfın içindeki her şey, 3. satırdaki '{' sembolü ve 24. satırdaki '}' sembolü arasında tanımlanmıştır. Bizim sınıfımız yalnızca tek bir işlev içermektedir ve bu işlev 5. ve 23. satırlar arasında tanımlanmıştır. 5. satır bu işlevin adının main olduğunu gösterir. Her konsol uygulama programının tanımladığı sınıfın bir main işlevi içermesi gerekir. Bu programı çalıştırdığımızda ilk olarak bu main işlevine girilecek ve programın komutları o noktadan itibaren sırayla çalışmaya başlayacaktır. Şu an için 23. satırdaki diğer bilgileri olduğu gibi kabul edelim; çünkü onları daha sonra yeri geldiğinde daha ayrıntılı olarak işleyeceğiz. Şimdilik her uygulama programının bir main işlevi olması gerektiğini ve onun ilk satırının bu örnekteki gibi olmasını bilmemiz yeterli. ● ● 7. satır main işlevi içinde kullanılacak bir değişken (yourName) tanımlar. Bu satır bu değişkenin türünün String olacağını belirtir. Bu değişken içinde veri türü String olan değerleri saklayabiliriz. 11. ve 12. satırlar veri türü BufferedReader olan başka bir değişken (stdin) tanımlar. Bu satırlar sadece o değişkeni tanımlamakla kalmaz, aynı zamanda o değişkene ilk değerini de verirler. Burada klavye ile özdeşleşen System.in akışından new işlemcisi ile yeni bir InputStreamReader nesnesi yaratılır. Bu yaratılan InputStreamReader nesnesinden de yeni bir BufferedReader nesnesi yaratılarak stdin değişkeni içinde saklanır. Bu nesne klavyeden girdi almak için kullanılacaktır. 15. ve 16. satırlardaki çalıştırılabilir ifadeler ekrana veri girişi için mesaj bastırır. Bu komutlar çalıştıktan sonra ekranda, Adinizi girin ve enter tusuna basin mesajı gözükecektir. 19. satır klavyeden sizin yazacağınız adınızı okur ve onu yourName değişkeninin içine saklar. Adınızı yazdıktan sonra Enter tuşuna bastığınızda adınız okunacaktır. 22. satırdaki komut da, programın okuduğu adın önüne 'Merhaba' sözcüğünü koyarak yeniden ekrana yazdırır. Konsol Uygulama Programlarının Yapısı Şimdi bir Java konsol programının genel yapısını inceleyelim. Her Java konsol programı, bir ya da birden fazla işlevi içeren bir sınıftan oluşur ve bu işlevlerden biri ana işlev (main method) olmalıdır. Hazır Java sınıflarından kullanmamız gerekenler varsa, bunlar programın başında belirtilir. Aşağıdaki şekil bu genel yapıyı göstermektedir: imported classes public class sınıfın-adı { public static void main (String args[]) throws IOException { değişkenlerin tanımlanması çalıştırılabilir ifadeler } varsa diğer işlevler } imported classes ● Bu bölümde, yazdığımız programın sınıfından erişilecek bütün hazır Java sınıfları import komutu kullanılarak belirtilmelidir. Hemen hemen yazdığımız bütün sınıflarda girdi ve çıktı yapacağımızı düşünürsek, girdi/çıktı işlemlerini kapsayan java.io paketindeki bütün sınıfları her programımıza eklemeliyiz. Bunu aşağıdaki ifadeyi kullanarak sağlayabiliriz: import java.io.*; public class Bundan sonra public class sözcükleri, o sınıfın adı olacak bir tanımlayıcı (identifier) tarafından izlenir. Bu sınıf içinde tanımlanacak her şey sınıf adını izleyen '{' ile onu kapatan '}' arasına konur. Bir uygulama programında en azından main işlevi bulunacağından sınıfın ilk işlevi olarak main işlevini tanımlarız. Bu main işlev, public static void main (String args[]) throws IOException { ile başlar ve kapatan '}' simgesine kadar devam eder. Değişkenlerin Tanımlanması Her değişken tanımlama ifadesi bir ya da birden fazla değişkeni tanımlar. Aynı türe sahip olan değişkenler tek bir tanımlama ifadesi ile tanımlanabilirler. Eğer birden fazla değişken tanımlanacaksa, değişkenlerin adları virgül ile ayrılır. Her değişkenin adı bir tanımlayıcıdır. Tanımlayıcılar, harfleri, rakamları, _ ya da $ karakterlerini içeren fakat rakamlar ile başlamayan sözcüklerdir. Java büyük harf küçük harf ayrımına duyarlı olduğundan, aynı harfin büyük harfi küçük harfinden farklıdır. Örnek bazı tanımlayıcılar: x y n1 n2 p5 newvalue kelime Bazı geçersiz tanımlayıcılar: 1a b+1 Değişkenler tanımlayıcıları ve türleri ile aşağıdaki gibi tanımlanırlar: int x, y, z; String prompt1, prompt2; int A; int b; Burada, int,String gibi sözcükler, anahtar sözcüklerdir ve değişkenlerin türlerini gösterir. Bunları daha ayrıntılı olarak önümüzdeki zamanlarda inceleyeceğiz. Çalıştırılabilir İfadeler ● ● ● ● ● ● Bu bölüme program işlediği zaman çalışan ifadeler konur. Bu komutlar çalıştırılabilir komutlar olarak bilinir. Bazı çalıştırılabilir komutlar şunlardır: atama ifadesi (assignment statement) işlev çağırma komutu (method call statement) if deyimi while deyimi Şimdiye kadar bir önceki bölümde yalnızca atama ifadesi ve işlev çağırma komutları ile karşılaştık. Örneğin, yourName = instream.readLine(); bir atama ifadesiydi ve System.out.println("Merhaba " + yourName); bir işlev çağırma komutuydu. Basit Bir Applet Programı ● İlerdeki örnekte verilen basit applet programı, önceki konsol uygulaması gibi sizin adınızı okur ve onu 'Merhaba' kelimesiyle birlikte appletin içine yazar. Bu applet programını yaratmak için bu örnekteki program bir editör yardımıyla AnaApplet.java kütüğünün içine konur. Daha sonra, javac AnaApplet.java komutuyla derlendiğinde AnaApplet.class adlı kütük yaratılır. Bu programı JDK içindeki appletviewer programı ile çalıştırmadan önce aşağıdaki satırları AnaApplet.html kütüğüne, yine bir editörle, yazmalıyız. <html> <applet code="AnaApplet.class" width=400 height=200></applet> </html> Daha sonra appletviewer AnaApplet.html komutuyla yarattığımız appleti çalıştırırız. Bu applet çalıştığında Şekil 2.4'teki applet ekranda gözükecektir. Appletin içindeki yazı alanının (TextField) içinde adınızı yazıp Enter tuşuna bastığınızda, yazı alanının hemen yanında 'Merhaba' kelimesiyle adınızı göreceksiniz. import java.awt.*; import java.applet.*; import java.awt.event.*; public class AnaApplet extends Applet implements ActionListener { Label prompt,greeting; // ciktilarin yapilacagi bolgeler TextField input; // girdinin yapilacigi bolge // aplet ilk calistirildiginda bu method cagrilacaktir ve // apletin gerekli olan kismilarini yaratacaktir. public void init() { // prompt bolgesini yarat ve appletin uzerine koy prompt = new Label("Adinizi girin ve enter tusuna basin: "); add(prompt); // input bolgesini yarat ve appletin uzerine koy input = new TextField(20); add(input); // greeting bolgesini yarat ve appletin uzerine koy greeting = new Label(" "); add(greeting); // "this" (bu applet) input bolgesindeki olaylari dinleyip // o olaylara karcilik verecektir. input.addActionListener(this); } // Bu method adinizi yazdiktan sonra her enter // tusuna bastiginizda cagirilacaktir public void actionPerformed(ActionEvent e) { greeting.setText("Merhaba " + input.getText()); input.setText(""); } } AnaApplet.java Örnek Applet Programının Yapısı: ● Özetle: – Programın başındaki import komutları ile java.awt,java.applet ve java.awt.event paketlerindeki bütün sınıflara erişiriz. java.awt paketinden TextField ve Label sınıflarını, java.applet paketinden Applet sınıfını kullanırız. Bu sınıflardaki bütün işlevlere erişebiliriz. – Yarattığımız yeni sınıf AnaApplet varolan Applet sınıfını genişletir. Eğer istenen bir işlev bizim sınıfımız AnaAppletin içinde varsa o işlev çalışacaktır; eğer yoksa o işlev Applet sınıfı içinde aranacaktır. Bu örnekte biz yalnızca init ve actionPerformed adlı iki işlev tanımladık. Appletimiz ilk çalışmaya başladığında init işlevi çalışarak appletimizin ilk görüntüsünü sağlayacaktır. Appletimiz üzerindeki girdi bölgesinden adınızı girip enter tuşuna bastığımızda ise actionPerformed işlevi çalışır. – AnaApplet sınıfında üç değişken (prompt, greeting, input) tanımladık. Bu değişkenler sınıf değişkenleridir ve o sınıftaki bütün işlevler tarafından erişilebilirler. Örnek Applet Programının Yapısı(Devamı) – – init işlevi appletimiz ilk çalışmaya başladığında çağrılır ve appletimizin ekrandaki görüntüsünü yaratır. Bu amaçla iki Label nesnesini verilen ilk değerleri ile new işlemcisini kullanarak yaratır, ve yaratılan nesneler prompt ve greeting değişkenlerinin içinde saklanır. Daha sonra adımızı girmek için kullanacağımız bir TextField nesnesi yaratır ve onu input değişkeninin içinde saklar. Bu TextField nesnesinin büyüklüğü (adımızı yazacağımız alanın büyüklüğü), 20 karakter uzunluğunda olacaktır. Bu üç nesne add işlevi ile appletimizin içine konur. Bu işlevde en son yaptığımız iş ise, input bölgesini appletimizin (this) bir dinleme bölgesi olarak addActionListener işlevini kullanarak kayıt ederiz. Böylece input bölgesinde her enter tuşuna basıldığında bu olay appletimize bildirilecektir. actionPerformed işlevi adımızı yazıp enter tuşuna bastığımızda çağrılır. greeting nesnesinin içi de, yazdığımız ad ve 'Merhaba' sözcüğünün birleşiminden oluşan dizin ile doldurulur. Yazdığımız ad input.getText() komutu yardımıyla okunur, daha sonra bu okunan ad ve bir dizin olan 'Merhaba' kelimesi + (ulama-concatenation) işlemcisinin yardımıyla birleştirilir. Bu birleştirme sonucunda elde edilen dizin greeting nesnesinin içine konan dizindir. input nesnesinin içi setText işlevi kullanılarak temizlenir. Örnek Applet Programının Yapısı(Devamı) – Gördüğünüz gibi, bir appletteki işlevler bir sırayla çağrılmaz. Appletteki işlevler bir olay (event) olduğunda ya da otomatik olarak sistem tarafından belirli bir noktada çağrılırlar. init işlevi yalnızca appletimiz ilk çalışmaya başladığında sistem tarafından bir kez çağrılır. Ama actionPerformed işlevi, her adımızı yazıp enter tuşuna bastığımızda çalışır. Appletimizi kapatmak istediğimizde bir olay olmuştur ve bu olaya karşılık verilecek olan işlev otomatik olarak çağrılır. Bu kapatma olayına karşılık gelecek işlevi kendimiz yazmadığımızdan Applet sınıfındaki kapatma işlevi çağrılmış olacaktır. Applet Programlarının Yapısı imported classes public class sınıfın-adı extends Applet { değişkenlerin tanımlanması işlevlerin tanımlanması } Applet Programlarının Yapısı (Devamı) ● ● ● Bu applet sınıfından erişilebilecek bütün sınıflar, konsol uygulama programlarındaki gibi, import komutu ile belirtilir. Genelde java.awt (girdi/çıktı yapan sınıflar) ve java.applet (applet sınıfı var) paketlerindeki sınıflara ihtiyacımız olduğundan bu paketlerdeki sınıflara erişir ve onları kullanırız. Eğer appletimizden olayları dinleyeceksek (girdi gibi), örneğimizdeki gibi java.awt.event paketindeki sınıflara erişmemiz gerekir. Yaratacağımız appletin tanımlanması, public class sınıfın-adı extends Applet { satırıyla başlar. Bu satırda sınıfımızın adı public class anahtar sözcüklerini izler ve sınıfımızın diğer sınıflar tarafından istenirse görüleceğini belirtir. Sınıf adını izleyen extends Applet, sınıfımızın Applet sınıfını genişlettiğini gösterir. Eğer appletimiz olaylara karşılık verecekse, satırımıza örneğimizdeki gibi implements ActionListener da eklemeliyiz. Appletin içi, '{' ve '}' arasında tanımlanır. Daha sonra appletimizin bütün işlevleri tarafından erişilebilecek değişkenler tanımlanır. Bu tanımlardan sonra appletimizin işlevleri tanımlanır. Yazacağımız işlevlerin bir bölümü appletimiz içinde olacak olaylara karşılık verecek olan işlevler, diğer bir bölümü de başka amaçlar için yazacağımız işlevler olacaktır. Appletimizde olaylara karşılık verecek bazı işlevler şöyledir: Applet Programlarının Yapısı (Devamı) ● ● ● ● ● public void init() Bu işlev, applet ilk başladığında bir kez çağrılır ve appletin ilk yapması gereken işleri yapar. public void paint (Graphics g) paint işlevi, init işlevinden sonra ve appletimizin yeniden boyanması gerektiği bütün diğer durumlarda otomatik olarak çağrılır. public void destroy() destroy işlevi, applet yokedileceği zaman çağrılır. public void actionPerformed(ActionEvent event) Bu işlev, appletimizde her olay olduğunda otomatik olarak çağrılır. (Yukarıdaki işlevlerin tümünü tanımlamak zorunda değiliz; yalnızca kontrol etmek istediğimiz bölümlerin işlevlerini yazarız ve geri kalan olaylar Applet sınıfının içindeki işlevler tarafından kontrol edilir. Eğer appletimizden bir işlev çalıştırılması istendiğinde, o işlev appletimiz içinde tanımlanmamış ise, o işlevi Applet sınıfından alırız.) SON