1 JAVA’nın Tarihçesinden Java, genel amaçlı nesneye yönelik bir programlama dilidir. Sözdizimi C ve C++’a çok benzer. Ba(cid:1)langıçta Java, küçük sistemleri tüketici aygıtlarına gömme yoluyla yazılımın kurulmasında kar(cid:1)ıla(cid:1)ılan sorunları adreslemek için geli(cid:1)tirilmi(cid:1)ti. Heterojen ileti(cid:1)im a(cid:2)ları, birden fazla ana mimari yapılar ve güvenli servis için tasarlanmı(cid:1)tı. Bu tür gereksinimlere kar(cid:1)ılık verebilmek için, Java herhangi bir sistemde çalı(cid:1)malı, a(cid:2)lar arasında ileti(cid:1)imi ve kullanıcının güvenli bir ortamda çalı(cid:1)masını sa(cid:2)lamalıydı. World Wide Web’in yaygınla(cid:1)ması Java’nın bu özelliklerinin açı(cid:2)a çıkıp herkes tarafından bilinmesine yardımcı olmu(cid:1)tur. Son zamanlarda insanların ilgi oda(cid:2)ı olan (cid:3)nternet’e eri(cid:1)imi basit yollarla kolayla(cid:1)tırmı(cid:1)tır. Mosaic gibi Web browser’lar milyarlarca insanın Net’te dola(cid:1)masını ve sörf yapmasını sa(cid:2)lamaktadır. Yüksek hızlı bir modemle network ortamına Mac, PC ya da UNIX bir makine ile ba(cid:2)landı(cid:2)ınızda en azından size, duyduklarınızın ve gördüklerinizin aynı olmasını sa(cid:2)lamalıdır. Web’in günden güne nüfusu artmaktadır. Ancak Web fanatikleri, Web’in HTML doküman formatı tarafından desteklenen içeri(cid:2)inin çok sınırlı oldu(cid:2)unu gördüler. HTML uzantıları, browser'ın kullanıcının istedi(cid:2)i tüm özellikleri sunmadı(cid:2)ını daha açık bir (cid:1)ekilde ortaya çıkardı. Bu sırada Java programlama dili aranan bir ba(cid:1)ka uygulamayı buldu. Java programlarını Web sayfalarına gömerek Java’nın ilginç özelliklerini kullanıma sunan Sun'ın HotJava browser’ı geli(cid:1)tirildi. Java’nın bu tür programlarına applet adı verilmektedir. Bu programlar görüntülendi(cid:2)i HTML sayfalarıyla birlikte HotJava browser’a yüklenir. Browser tarafından kabul edilmeden önce applet’lar, güvenilir oldu(cid:2)undan emin olmak için dikkatli bir (cid:1)ekilde kontrol edilmelidir. HTML sayfaları gibi derlenmi(cid:1) Java programları da ileti(cid:1)im a(cid:2)ları ve ba(cid:2)ımsız platformlardır. Applet programlar yüklendikleri makineleri ve geldikleri yerleri dikkate almadan çalı(cid:1)ırlar. 2 Java’nın C programlama diline çok benzedi(cid:2)ini söylemi(cid:1)tik. Ancak C’nin tersine Java’da belirteç kullanılmamaktadır. Bu durum güzel bir avantaj sa(cid:2)lamaktadır: Programın iyile(cid:1)tirilmesi sırasında hata oranı azalmaktadır. Böylelikle uzun zaman alan Boot ve Debuging’ler ortadan kalkmı(cid:1)tır. Bu farkı özellikle C kullanıcıları daha iyi görmektedir. Bunun yanı sıra türlerin birbirlerine dönü(cid:1)türülmesi i(cid:1)leminde Java, oldukça geni(cid:1) olanaklar sunmaktadır. Bu da karma(cid:1)ık i(cid:1)lemlerde hataların en ba(cid:1)tan yok edilmesine neden olmaktadır. Web toplumu Java’da bazı (cid:1)eylerin yeni ve oldukça önemli oldu(cid:2)una çok çabuk dikkati çekti. Web sayfalarını güçlendiren Java kullanıcıları makinelerine zarar vermeden güvenli bir ortamda çalı(cid:1)manın keyfini çıkarmaktadırlar. Java tüm applet programlarıyla birlikte (cid:3)nternet kullanımında yeni bir yol sunmanın yanı sıra kullanımını da oldukça kolayla(cid:1)tırmaktadır. 3 Günümüzde JAVA Java’nın yaratıcısı Sun Microsystems’in mühendislerinden biri olan James Gosling, bu u(cid:2)urda saçlarını a(cid:2)artmı(cid:1) ileri görü(cid:1)lü biri. Java tasarlanırken amacın piyasadaki bir çok programlama diline bir yenisini eklemek oldu(cid:2)unu zannetmiyorum, burada amaç bilgisayar dünyasına yeni bir ufuk açmak, yeni fikirler getirmek. Java’nın en büyük problemi kendisinden önce insanlara ula(cid:1)an bu yeni fikirlerin arasında kendini tanımlayamaması oldu. Ço(cid:2)u insan Java’yı bu fikirlerle aynı kefeye koydu, bir ba(cid:1)ka kesimse yüzüne bile bakmadı. Bundan dolayı ilk olarak Java ile Java’nın getirdi(cid:2)i fikirleri birbirinden ayırarak i(cid:1)e ba(cid:1)lamak istiyorum. Java, gerçek anlamda bir programlama dilidir. Java ile günümüzün popüler dili C++ ile ne yapılıyorsa hepsinin yapılması mümkündür. (cid:3)çinizden olur mu hiç öyle (cid:1)ey dedi(cid:2)inizi duyar gibiyim. Bal gibi de olur. Bilgisayar dilleri, syntax’ı hariç birbirlerinden çok farklı de(cid:2)illerdir. Önemli olan sizin programı yazmak istedi(cid:2)iniz platform için elinizde bulunan kütüphane(library)’lerdir. C++ bu konuda çok geni(cid:1) olup Java ise kısıtlıdır. Peki o zaman Java ile her (cid:1)ey nasıl yazılır? Java, ba(cid:1)ka bir dilde yazılmı(cid:1) bir kütüphaneyi çok rahat kullanabilmektedir. Bu da yeni do(cid:2)mu(cid:1) bu dilin i(cid:1)ini oldukça kolayla(cid:1)tırmaktadır. "Olur mu öyle (cid:1)ey o zaman Java programımız bütün platformlarda çalı(cid:1)maz!" i(cid:1)te bu cümle yine Java ile Java’nın felsefesini karı(cid:1)tıran cahilli(cid:2)in eseridir. Kim demi(cid:1) ki biz Java programlarımızı her platformda çalı(cid:1)tırmak istiyoruz diye. Bilgisayar programları satan bir yerden bir yazılım (software) alırken hangi platform için yazıldı(cid:2)ına bakarak alırız, ve de gidip aynı software’i cep bilgisayarımızda da güle oynaya kullanabilece(cid:2)imiz fikrine kapılmayız (tabi e(cid:2)er program cep bilgisayarı için yazılmadıysa). Aynı mantıktan yola çıkarak Java ile Java derleyicisini elde edebilece(cid:2)imiz herhangi bir platform için spesifik olan bir yazılım çıkarmak hiçte yanlı(cid:1) bir davranı(cid:1) de(cid:2)ildir. Microsoft, Java’ya bir programlama dili olarak verilmesi gereken önemi daha çok önceden anlamı(cid:1), ve çıkardı(cid:2)ı Visual J++ adlı software’inde PC platformuna spesifik program yazmak için gereken bir çok gereci içine koymu(cid:1)tur. Sun Microsystems ise kanımca yanlı(cid:1) bir strateji izleyerek bunu baltalamaya çalı(cid:1)maktadır. 4 (cid:3)(cid:1)te Sun Microsystems ile Microsoft arasında uzun süredir süren davaların nedeni bundan ileri gelmektedir. Peki ama Sun’ın, Microsoft’la alıp veremedi(cid:2)i nedir? Niçin faydalı bir(cid:1)eyi baltalamaya çalı(cid:1)maktadır? Bunu anlamak için Java’nın getirdi(cid:2)i fikirleri anlamak gerekir. Java’nın bir programlama dili oldu(cid:2)unu anladık. Peki getirdi(cid:2)i fikirler nelerdir? Java tasarlanırken amaç, bu dille yazılan bir programı kolay bir (cid:1)ekilde di(cid:2)er platformlara ta(cid:1)ıyabilmekti. Bir platform için yazılmı(cid:1) bir yazılımın ba(cid:1)ka bir platformda çalı(cid:1)ır hale getirmek çok emek gerektirir. (cid:3)(cid:1)te Java bu probleme ilaç olmak için dü(cid:1)ünüldü. Peki bu i(cid:1) nasıl olur? Öncelikle, bütün dünyadaki bilgisayar tasarlayıcılarının bir araya gelip ortak, herkesi memnun edecek bir bilgisayar çıkartması ufukta görünmedi(cid:2)i için, bu i(cid:1)i yazılım bazında halletmek gerekir. Bunun için Sun "Virtual Machine" dedi(cid:2)i sanal bir bilgisayar tasarlamı(cid:1)tır. Bu sanal bilgisayar, sizin gerçek bilgisayarınızda çalı(cid:1)an bir program olup, Java programlarınızı çalı(cid:1)tıracaktır. Burada ortaya atılması gereken en büyük soru (cid:1)u olmalıdır: "(cid:3)yi de bu Virtual Machine denen programı butun platformlar için nasıl ve kim yazacak?" (cid:3)(cid:1)te Sun Microsystems ve birçok Java programcısının gözünden kaçan da bu olmu(cid:1)tur. Su anda bu sanal bilgisayar bir elin parmaklarını geçmeyecek kadar de(cid:2)i(cid:1)ik platform için hazırda vardır, gelecekte bu sayının artması beklentimiz olmalıdır. Üstüne üstlük bu platformlardaki Virtual Machine’in en son versionlarını sadece iki platformda bulmak mümkündür. PC ve Sun’ın üretti(cid:2)i Solaris. Apple maalesef yarı(cid:1)ta geride kalmı(cid:1)tır. Bu nedenden dolayı Sun’ın Microsoft’u, Java’yı güçlü bir programlama dili olarak sunmasını baltalamaya çalı(cid:1)ması yanlı(cid:1)tır. Nede olsa, Java ile yazılan programlar hiç bir zaman dünyadaki bütün platformlarda çalı(cid:1)mayacaktır. Bunu dü(cid:1)ünmek aptallık olur. Olayın biraz daha detayına inelim. Yukarıdaki paragrafta aslında dikkatli incelenirse bazı yanlı(cid:1)lar vardır, aslında basite indirgemek desek daha do(cid:2)ru olur. Virtual Machine’i baska bir platforma aktarmak zor olan bir (cid:1)ey de(cid:2)ildir ve de ilk çıktı(cid:2)ından bu yana fazla yeni sürümüde çıkmamı(cid:1)tır. (cid:4)imdi yine bazı okuyucular bana gülüyorlar biliyorum, hatta içlerinden (cid:1)u cümle geçiyor: "Çıktı(cid:2)ından beri de(cid:2)i(cid:1)tirmedikleri yeri kalmadı, bir ö(cid:2)rendi(cid:2)imiz ertesi gün yok!" Programcılar bu kaygılarını dile getirirken aslında bir (cid:1)eyi unutmaktadırlar. De(cid:2)i(cid:1)en Virtual Machine 5 de(cid:2)ildir. De(cid:2)i(cid:1)en Virtual Machine ile birlikte Sun'in tasarladı(cid:2)ı standart kütüphanelerdir. Bir dili kullanılır yapan ö(cid:2)enin kütüphanelerinin geni(cid:1)li(cid:2)i oldu(cid:2)unu daha önce belirtmi(cid:1)tim. (cid:3)(cid:1)te bu kütüphaneleri de(cid:2)i(cid:1)ik platformlara ta(cid:1)ımak gerçek bir azaptır, ve de bir gecede olmayacaktır, çünkü bir PC de ekrana bir pixel basmakla, bir Macintosh’ta ekrana bir pixel basmak farklı prosedürlerdir. Peki Sun kendine Microsoft’a kar(cid:1)ı destekçi nasıl bulmaktadır. Bu o kadar zor bir (cid:1)ey de(cid:2)ildir. Microsoft piyasadaki monopol olarak zaten bir çok kullanıcının ve programcının nefretini kazanmayı ba(cid:1)armı(cid:1)tır. Dakka ba(cid:1)ı yeniden ba(cid:1)latmak zorunda kaldı(cid:2)ımız Windows’da bunun cabasıdır. Tek yapılması gereken piyasaya bir slogan atmaktır: "Visual J++ ile yapılan Java programlarınız ba(cid:1)ka platformlarda çalı(cid:1)maz!". Bu do(cid:2)ru bir cümle de(cid:2)ildir, ama amacına ula(cid:1)maktadır. Burada bizlerin anlaması gereken, Java’ya yeni ba(cid:1)layan birinin ne yaptı(cid:2)ını bilmeden bu yazılımı kullanıp yazdı(cid:2)ı bir Java programının ba(cid:1)ka platformlarda çalı(cid:1)mama olasılı(cid:2)ının bulundu(cid:2)udur. (cid:4)ahsen ben Visual J++’ in son sürümünü be(cid:2)enerek kullanıyorum, ama kesinlikle bu i(cid:1)e yeni ba(cid:1)layan birine tavsiye etmiyorum. Ele(cid:1)tiriler çok da yersiz de(cid:2)il. Ancak, önemli noktayı kaçırmamak gerekir. Microsoft, kanımca Java konusunda kendisine özgü olmayan bir (cid:1)ey yapıyor: gerçekten faydalı olmaya çalı(cid:1)ıyor. Sun ise Microsoft’a pazarı kaptırmanın verdi(cid:2)i hiddetle saldırıyor. Olaydan zararlı çıkan aslında yine biz programcılarız. Yazımı biraz da Java’yı popüler yapan "Java Applet" lerinden bahsederek tamamlamak istiyorum, çünkü maalesef etrafta bilir bilmez konu(cid:1)ulan kavramların ba(cid:1)ında geliyor. Java Applet’lerinin Java programlarından farkı, web browser’ınız tarafından çalı(cid:1)tırılabilmesi, ve de Internette dola(cid:1)ırken bir web sayfasında kar(cid:1)ımıza çıkabilece(cid:2)i için güvenli(cid:2)iniz dü(cid:1)ünülerek sınırlandırılmı(cid:1) olmalıdır. Konun detayları, bu sınırlandırmanın nasıl yapıldı(cid:2)ı, veya nasıl kaldırılabildi(cid:2)i yine bu yazının içeri(cid:2)i de(cid:2)ildir. Bunların haricinde Java Applet’leri, Java programlarından hiç farklı de(cid:2)ildir, onlar da Virtual Machine ile çalı(cid:1)tırılırlar. Önemli olan nokta Java Applet’lerini yazarken platform spesifik kütüphaneler kullanılmaması gerekti(cid:2)idir. Çünkü sizin web sayfanızı ziyaret eden ki(cid:1)inin ne marka bilgisayar kullandı(cid:2)ını bilemezsiniz. (cid:3)(cid:1)te Sun’ın standart kütüphanelerdinden (cid:1)a(cid:1)mamanız gereken yer burası. Yok hayır, beni sadece PC 6 kullanıcıları ba(cid:2)lar derseniz, o zaman istedi(cid:2)iniz yapmakta yine serbestsiniz. Kalkıp Microsoft’un DirectX kütüphanesini kullanıp 3 boyutlu mekanlarda insanları dola(cid:1)tırmak mı istiyorsunuz, yada insanların kula(cid:2)ına Directional Audio ile hitap mi etmek istiyorsunuz? Bunların hepsi mümkün. Unutulmaması gereken Applet’lerin uzunca bir süre gerçek programların yerini alamayaca(cid:2)ı. Dü(cid:1)ünülmesi gereken bir ba(cid:1)ka nokta ise, Appletler’in bu amaçla kullanılmasının ne kadar do(cid:2)ru oldu(cid:2)u. Bunu size dü(cid:1)ünme konusu olarak bırakıyor, bir ba(cid:1)ka yazıda tartı(cid:1)mayı diliyorum. Java’yı desteklemeyi bırakmayın. Herkese iyi programlamalar. 7 JAVA D(cid:1)L(cid:1)NE G(cid:1)R(cid:1)(cid:2) Java’ ya Ba(cid:3)larken Derleme birimi olarak adlandırılan bir Java kaynak kütü(cid:2)ü bir ya da birkaç sınıf tanımı içeren bir metin kütü(cid:2)üdür. Java derleyici, bu kütüklerin .java kütük adı uzantısı ile yüklenmesini bekler. Java kaynak kodu derlendi(cid:2)i zaman, her bir sınıf kendi çıktı kütü(cid:2)üne yerle(cid:1)tirilir. Java’da genel fonksiyonlar ve de(cid:2)i(cid:1)kenler olmadı(cid:2)ı için, bir Java kaynak kütü(cid:2)ünde olabilecek tek (cid:1)ey bir ya da birkaç sınıfın tanımıdır. (cid:3)lk Java programımızı yazalım. class HeyDünya { public static void main(String args[ ]) { System.out.println("Hey Dünya!"); } } Java, tüm kodların adı olan bir sınıfta yer almasına gereksinim duyar. Kütük adının harf düzeninin sınıf adına uygun oldu(cid:2)undan emin olduktan sonra, bu metni HeyDünya.java adlı bir kütü(cid:2)e yüklemelisiniz. Kütük adlarının sınıf adına uygun olması. programınızı çalı(cid:1)tırmada çok yardımcı olacaktır. Java derleyici javac’ı çalı(cid:1)tırarak ve komut satırı üzerinde kaynak kütü(cid:2)ün adını belirterek bu metni derleyebilirsiniz; a(cid:1)a(cid:2)ıda gösterildi(cid:2)i gibi: C:\> javac HeyDünya.java Javac derleyici, yeni programın bayt kodundan ba(cid:2)ımsız olarak derlenmi(cid:1) bir i(cid:1)lemciyi kapsayan ve adı HeyDünya.class olan bir kütük hazırlayacaktır. Bayt kod, Java Sanal Makina (Java Virtual Machine) yorumlayıcı için makine dili komutlarını içeren programınızın bir ara sunumudur. Bu programı çalı(cid:1)tırmak için, bu yeni sınıfı 8 önce yükleyen, sonra çalı(cid:1)tıran bir Java yürütme zamanınızın olması gerekir. Bunu yapmak için ise, java komut satırında argüman yerine HeyDünya adlı sınıfa geçi(cid:1) yapmanız gerekir. C:\>java HeyDunya Hey Dünya! Bu noktada önemli olan, Java derleyicinin ve yürütme zamanının do(cid:2)ru olarak, kurulmasıdır. (cid:4)imdi, yazdı(cid:2)ımız programı satır satır inceleyelim. "HeyDunya" basit bir program olmakla birlikte ilk kez kullandı(cid:2)ınız yepyeni bir programlama dili ile tanı(cid:1)mı(cid:1) oldunuz. Bunun yanısıra yeni kavramlar ve ayrıntılar için attı(cid:2)ınız ilk adımdır. (cid:3)(cid:1)te ilk satırımız: class HeyDunya { Bu satır, yeni bir sınıfın tanımlandı(cid:2)ını bildirmek için class sözcü(cid:2)ünü kullanır. HeyDunya, sınıfı tanıtmak amacıyla kullandı(cid:2)ımız geçerli bir tanıtıcıdır. Açık küme (kıvrımlı) parantezi ({ ) ile kapalı küme (kıvrımlı) parantezi ( }) arasında sınıfın tam adı, kod ve veri yer alır. Java’da bu parantezlerin kullanımı C ve C++ yapısı ile e(cid:1)de(cid:2)erdir. public static void main(String args[ ]) { Bu basit programın ikinci satırı genel fonksiyonların olmadı(cid:2)ını, yalnızca sınıfların yer aldı(cid:2)ını bildiren Java tasarımı ile zorla(cid:1)tırılır. Alan ve yöntemler biraraya gelerek sınıfları olu(cid:1)turur. Sınıfın tanımı sınıfın yapısını ve hareketini belirler. Yöntemler fonksiyonlardan biraz daha farklı olup kendi sınıflarının veri alanlarına (de(cid:2)i(cid:1)kenlerine) eri(cid:1)ebilirler. 9 public public anahtar sözcü(cid:2)ü bir eri(cid:1)im belirleyici olup, programcıya her bir de(cid:2)i(cid:1)kenin ya da yöntemin kontrolünü verir. Burada public anahtar sözcü(cid:2)ü herhangi bir sınıfın main yöntemini görebildi(cid:2)ini göstermektedir. private Bu tip bir sınıfa yalnızca paket içerisinde ula(cid:1)ılabilir. Bir sınıfın tanımlanması sırasında public ya da private oldu(cid:2)u belirtilmedi(cid:2)i zaman, sınıfın otomatik olarak private oldu(cid:2)u kabul edilir. abstract Soyut yöntemlerin yer aldı(cid:2)ı sınıfları belirtir. Soyut yöntemler program kodu olmayan anlamına gelmektedir. Soyut sınıflar di(cid:2)er sınıflar için yapı olu(cid:1)turur. static Bir sınıfa uygulanan yöntem ve de(cid:2)i(cid:1)kenlerin static oldu(cid:2)u bildirilir. Yöntem, sınıfın özel bir örne(cid:2)inin çalı(cid:1)tırılmasına gerek kalmadan ça(cid:2)rılabilir. Main durumunda örneklerden önce yorumlayıcı tarafından ça(cid:2)rıldı(cid:2)ı için, static oldu(cid:2)unu bildirmek gerekir. Static oldu(cid:2)u bildirilen yöntemler, statik ve yerel de(cid:2)i(cid:1)kenlerden ba(cid:1)ka herhangi bir (cid:1)eye do(cid:2)rudan ba(cid:1)vuramayabilir. Nesneye yönelik programlama dillerinde statik de(cid:2)i(cid:1)ken ve yöntemlere sınıf de(cid:2)i(cid:1)kenleri ve sınıf yöntemleri adı verilmektedir. void Genellikle birtakım özel türlerin de(cid:2)erleri için yöntemler kullanılır. Örne(cid:2)in tamsayı de(cid:2)erler için int, gerçel sayı de(cid:2)erleri için float ya da daha karma(cid:1)ık de(cid:2)erler için bir sınıfın özel adları kullanılmaktadır. 10 main Java, tüm anahtar sözcük ve tanıtıcılara göre harfe duyarlı bir yapıya sahiptir. Bir ba(cid:1)ka deyi(cid:1)le Java’da Main ile main farklı yöntemleri ifade etmektedir. Java derleyici, bir main yöntemi olmayan sınıfları derler. Ancak Java yorumlayıcı bu sınıfları çalı(cid:1)tırmaz. Bu programı yanlı(cid:1) yazdı(cid:2)ınızı ya da Java tanıtıcılarının harfe duyarlı oldu(cid:2)unu bilmedi(cid:2)inizi varsayalım ve main yerine Main yazdı(cid:2)ınızı kabul edelim. Derleyici HeyDunya adlı sınıfınızı derler. Kullandı(cid:2)ınız Java yürütme zamanı, çalı(cid:1)mayı ba(cid:1)latacak yöntemi bilmedi(cid:2)i için derlemeyi gerçekle(cid:1)tirir. Örne(cid:2)in main sözcü(cid:2)ünü hatalı yazdıysanız, programı çalı(cid:1)tırmak istedi(cid:2)inizde a(cid:1)a(cid:2)ıdaki mesajı alırsınız: C:\> java HeyDunya HeyDunya sınıfında: void main (String argv[ ]) tanımsız Yöntemlerin bir kısmı parametrelere gereksinim duyar. Bu parametreler parantez içerisinde belirtilir. Verilen yöntem için parametreye gereksinim yoksa, parantezi bo(cid:1) olarak yerle(cid:1)tirmeniz gerekir. Bizim örne(cid:2)imizde gördü(cid:2)ümüz gibi kullanılan bir parametre vardır. String args [ ], args adlı bir parametreyi göstermektedir. Tanıtıcıdan sonra kollanılmı(cid:1) olan kö(cid:1)eli parantezler ([ ]), bunun türünün bir dizi oldu(cid:2)unu göstermektedir. String karakter dizilimleri depolayan bir sınıftır. Yorumlayıcının ba(cid:1)langıç yeri main yöntemidir. Program bir düzine sınıfa sahip olabilir, ancak bunlardan biri main yöntemine sahip olabilir. Applet’lar (Web browser’larda gömülü olan küçük Java programlarına denmektedir) hazırlamaya ba(cid:1)ladı(cid:2)ınız zaman, Web browser’ın Java yürütme zamanı farklı bir kalıba sahip oldu(cid:2)undan main yöntemi kullanılmaz. System.out.println("Hey Dünya!");