Java Notlarım -7
Threat ve Process Nedir?
Prosess bir uygulamanın bellekte kendi başına koşmasıdır. Örneğin bir kelime işlemci ile müzik player aynı anda sisteminizde çalışabilir. Bu durumda her bir programın ayrı bir belleği vardır ve bu bellek alanında varlıklarını sürdürürler.
Modern sistemlerde prosessler başka proseslerin varlıkları ile ilgilenmezler. Şayet birbirleri ile haberleşme durumu söz konusu ise işletim sisteminin kaynaklarını kullanırlar. Bu zahmetli ve platform bağımlı bir işlemdir.
Threat’lar ise bir processten farklı olarak aynı belleği paylaşırlar fakat aynı anda işlem yapmaya devam ederler. GUIsi olan bir program hayal edin bir düğmeye basmanız durumunda çok uzun işlem yürütüyorsanız vu esnada diğer form fonksiyonları donup kalacaktır. Ama bu işlem farklı bir threatte yürüyorsa sistemin bu işlemi yürüttüğünü gözlemlemeyebilirsiniz.
Threatler için daha zahmetsiz bir haberleşme yapısı ortaya konabilmektedir. Java dili Threat’leri destekler.
Java’da Threat
Her Threatin bir önceliği vardır. Java SE uygulamaları main threatten başlar ve bunun üzerinde çalışır. Ayrıca her threatin birde önceliği mevcuttur. Önceliği yüksek olan kanal diğer düşük öncelikli threati askıya alabilir ve sonlandırabilir.
Threatler kendi başlarına asenkron şekilde çalısırlar. Fakat java senkron hale getirmek için bazı matetlar da sunmuştur.
Threat Sınıfı
Her threat bir Threat sınıfı ile ifade edilebilir. Temel metotlar şunlardır.
getName(); setName(); getPriority(); isAlive(); join() run() sleep(long milisaniye); start(); currentThreat();
Threat Oluşturmak
Java dilinde threat oluşturmanın iki yolu vardır. Bunlar;
Runable Interface
Threat sınıfının yapılandırıcısında (runable sınıf, String Kanaladı) şeklinde bir yapılandırma özelliği vardır. Bu sayede bir runable interface kullanan sınıfı threat içine alabilirsiniz. Daha sonra threatin start() metodunu kullanarak arabirimi çağrabilirsiniz.
Runable Interface içerisindeki run() metodunun overwrite yapılması gerekmektedir. Bu interface’i kullanan sınıf run metodundan itibaren yürütülür. Örnek kullanım şekli şöyledir.
class NewThreat implements Runable { Threat myThreat; NewThreat() { myThreat= new Threat(this, "New Threat"); myThreat.start(); } public void run() { // çalışacak kodlar } } class MyApplication { public static void main (String args[]) { // kodlar NewThreat nt= new NewThreat(); // kodlar; } }
Threat Extends
Diğer bir metot da Threat sınıfını genişletmektir. bu durumda run() metodunu overwrite yapmak gerekir.
class NewThreat extends Threat { NewThreat() { super("New Threat"); start(); } public void run() { // çalışacak kodlar } } class MyApplication { public static void main (String args[]) { // kodlar NewThreat nt= new NewThreat(); // kodlar; } }
isAlive() ve join()
Yaratılan yhreatin bitmesi ve bitmeden programın sonlanmaması gibi şeyler isteyebilirsiniz. Bir threatin hala çalışıp çalışmadığını isAlive ile kontrol edebilirsiniz. Bitmesini beklediğiniz durumda ise join() metodu kullanılır.
synchronized Sözcüğü
Bir threat bir sınıfta herhangibir metoda erişirken diğer sınıfın erişiminin sırada beklemesini istersiniz. Bunun için bu ifadeyi kullanırız. Örneğin:
class ErisilecekSinif{ synchronized void callMe(){ // kodlar } }
şeklinde erişilecek metodu belirlersiniz. synchronized ifadesini sınıfın her hangi bir ifadesine erisirken ve sınıfı da siz yazmadıysanız ilgili nesneyi senkronize ederek de erişimde kullanabilirsiniz. Örneğin
class MyThread extends Thread{ MyThreat(){ // kodlar } public void run(){ ErisilecekSinif es= new ErisilecekSinif(); // kodlar synchronized(es){ // senkronize kodlar es.callMe(); } // kodlar } }
wait(), notify(), notifyall();
üç metot da Object sınıfı tarafından her sınıfa kazandırılmış birrer metottur. wait metodu ile karşılaşan threat çalışmasını durdurur. Sınıfın tekrar çalışabilmesi için başka bir threat notify metodunu çalıştırmalıdır. notify metodu sıradaki duran threati çalıştırır. notifyall ile duran tüm threatları çalıştırır.
Bir sonraki yazıda…
threat kavramı javanın en önemli kavramlarından biridir. İyi anlaşılması program süreçlerini büyük ölcüde değiştirmenize olanak tanır.
Bir sonraki yazıda enum ifadesine, AutoBoxing kavramına, ve Annotion yaratmaya deyeneceğiz.
Java Notlarım -6
Java Dilinde Exception
İstisna veya diğer adı ile exception Javada programın çalışması esnasında karşılaşılabilen çalışma zamanı hatasıdır. Java bu hataları yönetmek için C++ dilinden aldığı bazı kavram ve komutları kullanır fakat daha gelişmiş anlamlar yükler. bu sözcükler try, catch, throw, throws ve finally’dir.
Temel try kullanımı aşağıdaki gibidir.
try { // hata kontrolü yapılan kod } catch (exception_tipi obj) { // yakalanan hata olursa } catch (exception_tipi2 obj) { // yakalanan hata olursa } finally { // hata olsa dahi çalışacak kod. }
try bloğu içerisindeki herhangibir kod bir exception fırlatırsa bu yakalanmaya çalısılır. Tüm istisnalar Trowable sınıfından extends olmuşlardır.
Javada sadece çalışma zamanı exception’ları değil aynı zamanda try bloğunun içerisindeki fonksiyonların türettiği exceptionlar da yakalanabilir. Bir exception fırlatmak için throw komutu kullanılır.
throw new AritmeticException ("hata Oldu");
bir standart exception oluşturmanın bir yoludur.
Diyelim ki bir sınıf yazdınız ve bu sınıftaki bir metot throw kullanıyor bu durumda iki zorunluluğunuz ortaya çıkar. Birincisi metodu throws ile işaretleyip fırlattığı exceptionları sıra ile yazmalısınız.
void methot(int z) throws MyException { // kodlar throw new MyException ("Benim yazdığım hata"); // kodlar return; }
ikincisi de bu metodun çağrıldığı tüm bloklarda try catch kullanılmalıdır.
try{ a.methot(3); } catch (MyException hata) { // hata işlemi }
throws sözcüğü bize bu iki yeni zorunluluğu getirir. Bu zorunlulukların iki güzel sonucu olur. Birincisi bir kütüphane veya paket kullanıyorsanız try içine alıp hata denetimi yapmazsanız fonksiyonunuzu derleyemezsiniz. İkincisi siz bir pobje yazarsanız hata denetimine zorlayabilirsiniz. Gerek eclipse gerekse Netbeans olsun pek çok IDE sizi throws metotlarda hemen uyarır ve kodunuzu düzeltir.
Javanın bu şekilde exceptiona zorlaması C++ da olan en problemli sorunu ortadan kaldırabilir. Bir C++ fonksiyonunun hata durumunda -1 mi yoksa 0 gibi bir değer geri döndürdüğünü bilemezsiniz. Ama javada exceptiona bir zorlama durumu sözkonusu bu sayede IDE bir hata yakalama sistemi yazmaya bizi zorlar.
Hata yakalamada javanın kullandığı bir diğer sözcük de finallydir. Hata durumu söz konusu olsa bile çalışan bir kod blogu eklemenize müsade eder.
Yerleşik Exception’lar
Java dilinde java.lang paketinde belirli istisnalar yer alır. Üstelik sınıfınızda bu istisnaların throws olmasına da gerek yoktur. Bu istisnalara unchecked exceptions denir. Bunlar:
AritmaticException ArrayIndexOutOfBoundsException ArrayStoreException ClassCastException IllagalArgumentException IllegalMonitorStateException IllegalStateException IllegalThreadStateException IndexOutOfBoundsException NegativeArraySizeException SecurityException StringIndexOutOfBounds TypeNotPresentException UnsportedOperationException
Kendi İstisnanı Yazmak
Tüm istisnalar Throwable classından extends olan Exception sınıfından türetilirler ve Throwable özelliklerini barındırır. Trowable sınıfının metotları:
Throwable fillInStackTrace(); Throwable getCause(); String getLocalizedMessage(); String getMessge(); StackTraceElement[] getStackTrace(); Throwable initCause(Throwable neden); void printStackTrace(); void printStackTrace(PrintStream akis); void printStackTrace(PrintWriter akis); void setStackTrace(StackTraceElement e[]); String toString();
Genellikle bir exceptionda toSting metodu ile değerini almak yeterlidir. Genel kullanımı;
class MyException extends Exception { MyException(int a) { // kodlar } // kodlar public String toString(){ //kodlar return hatametni; } } class MyClass{ // kodlar public void metot() throws MyException { // kodlar throw new MyException(a); // kodlar } // kodlar } class Program{ public static void main(String args[]){ // kodlar MyClass a= new MyClass(); // kodlar try { a.metot(); } catch (MyException e) { System.out.println(e); // kodlar } finally { // kodlar } } }
şeklindedir.
Exception’u standart bir dallanma değil sadece hata kontrolünde kullanmak makul olan uygulama metodudur.
Bir Sonraki Yazıda …
Javada Multi Thread Programlama anlatılacak. Senkronizasyon ve Mesajlaşma bilgileri verilecek. Thread öncelikleri anlatılacak. synchronized ifadesine değinilecek. Threadleri askıya almak ve çalıştırmak konularına yer verilecek.
Java Notlarım -5
Java Dilinde Paketler
javada paketler package ifadesi ile tanımlanır. Paketler aynı zamanda sınıfın bulunduğu dizine de işaret eder. örneğin package a.b.c a dizininin altındaki b dizininin içerisindeki c dizinidir aynı zamanda. PJava paketler ile birlikte 5×4 bir matrisle ifade edilebilecek bir erişim kontrolü sunmuş olur.
Private Belirtecsiz Protected Public
Aynı Sınıf Evet Evet Evet Evet
Aynı paket alt sınıf Hayır Evet Evet Evet
Ayni Paket altsınıf olmayan Hayır Evet Evet Evet
Değişik paket alt sınıf Hayır Hayır Evet Evet
Değişik paket alt sınıf olmayan Hayır Hayır Hayır Evet
Paketleri yönetme işini bizim için gerek eclipse gerekse Netbians programı yürütebilmekte. Yapmamız gereken temel şey önce bir paket ilave etmek ve ardından sınıfları bunun altına eklemektir.
Bir sınıfa dahil olmadığı bir paketi eklemek istersek bu durumda import paket adı şeklinde bir tanımlama yapmamız gerekecektir.
Javada pek çok kütüphane bulunmakta ve bunlar da ClassPath içerisinde paketler halinde yer almaktadır.
İyi bir java programında bir paket tanımlayarak başlamanız doğru olandır. Paketiniz için web sitesi gibi isim vermek doğru bir metottur. com.okanakyuz.ornek gibi isimler vererek aynı sınıf adlarının tekrarını
engelleyebilirsiniz. Bezer şekilde her sınıfı da yanlız bir dosyada ve baş harfi büyük isimle saklamak standart java programlamaya uygun yaklaşımdır.
Interface Tanımlamak.
İnterfaceler abstract sınıflara benzerler fakat abstract sınıflarda olduğu gibi bir içerisinde kod barındıran metot barındırmazlar. Sadece prototiplerdirler. Yazılımları sınıfların aynısıdır. Örneğin
interface A{ void method (); // gibi }
şeklindedir. Yine eclipse vaya netbians ile pir paketin altına sınıf ekler gibi eklenirler. (Burada sıklıkla bu iki IDE bu işlemi yaptığı için metin dosyaları ile yapılan işlerle ilgili kafa yormamayı yiğeliyorum)
Bir sınıf birden çok interface’i aynı anda kullanabilir. Temel sözdizimi şöyledir.
class Sınıf_Adı extends Ust_Sınıf implements A_Interface, B_Interface { //kodlar }
Görüldüğü gibi interfacei kullanmak için implements sözcüğü kullanılmaktadır. Burda bu uygulamanın en güzel yanı IDE tarafından doldurmanız gereken metotların sınıf yaratılırken gerçekleştirdiğiniz form ile birlikte boş olarak yüklenmesidir.
Arabirimler üst sınıf olarak deklere edilebilir. Örneğin A adında bir interface ve B adında bunu kullanan bir sınıf varda A obj= new B(); geçerli bir tanım olur.
Bir arabirim aynı zamanda genişletme yeteneğine de sahiptir. Sınıflarda olduğu gibi bu durumda extends sözcüğü kullanılır.
interface A extends B { // tanımlar }
geçerli bir sözdizimidir.
Bir Sonraki Yazıda …
Birdahaki yazıda exception kavramına değinilecek ve kendi exceptionımızı nasıl oluşturacağımızı anlatacağız.
Java Notlarım -4
Java Dilinde Sınıflar
Java dilinde sınıflar basit anlamda C++ dilindeki yapıyı bire bir aşır. C++ dilinden farklı olarak java dilinde sınıfların protetiplerinin yer aldığı bir başlık dosyası Java literatüründe bulunmaz. Java dilinde class içerisinde özelliği belirtilmemiş her metot ve değişken varsayılan olarak public durumdadır. C++ dilinde olduğu gibi Javada metotların (C++ da fonksiyon deme alışkanlığımız vardı) sınıf yapısı dışarısında tanımlandıkları görülmez.
Şayet bir sınıfın public static void main metodu varsa o sınıf direkt çalıştırılabilir. Java programlarında genellikle yanlız ve yanlız bir tane bu özellikte sınıf yer alır.
Bir Java dosyasında aynı anda birden fazla sınıf deklare edilebilir fakat Dosya adı ile ismi aynı olan sınıfa diğer java dosyalarından erişilebilir. Bu nedenle Java programlarında sınıflar yanlız ve yanlız tek dosyada tutulması tercih edilen programlama metodudur. Java dilinde bu stratejinin benimsenmesi sayesinde
sınıf mimarisinin hemen hemen herkez tarafından benzer şekillerde yazılması ve böylece kod bakımının kolaylaşması sağlanmıştır.
Javada başka bir yerde sınıfın ismi ile yeni bir değişken deklera etmek nesne yapısından ötürü tek başına birşey ifade etmez. Nesnenin deklerasyonu ile sadece nesneye içi boş bir referans oluşturulur. Nesneyi yaratmak için bellekten nesneyi talep etmeniz yani new anahtar sözcüğünü C++ dilinde kullandığınız gibi
kullanmalısınız.
Sınıf Yapılandırıcıları ve This Sözcüğü
Java dilinde bir sınıfın yapılandırıcısı C++ dilinde olduğu gibi sınıf ismi ile aynı ismi taşıyon ve geri dönüş değeri olmayan metotlardır.
Java dili aynı zamanda sınıfın kendisini ifade etmek maksadı ile this sözcüğünü kullanır. Bunu da C++ dilinde olduğu gibi yapar.
Atık Toplama ve finalize()
C++ dilinde olduğu gibi delete sözcüğü ile bir nesnenin geri alınması işlemi java programcıları için söz konusu değildir. Bu kodlama zamanı hatalarını da minimuma indiren bir teknik ile program yazmamıza yadımcı olur. Java programcıları için bir değişkenin yok edilmesi sürecini garbage collection yani
atık toplama halleder.
Kimi durumlarda JNI gibi bir metotla (JNI hakkında daha sonra yazacağım) ulaştığınız harici bir kodu veya javaya bağımlı olmayan bir nesneyi çağran bir sınıfı yok ettiğinizde Javanın aynı anda o sınıfı atık toplama ile yok ederken bazı işlemler yürütmesini isteyebilirsiniz. Bunun için sınıfınızda
protected void finalize(){ //kod }
protetipinde bir metot içerisinde bunu yapmanız yeterlidir. Atık toplama (gc) bir sınıfı yok ederken önce bu metodu çağırmaktadır.
finalize metodu aslında Object sınıfı içerisinde tanımlıdır. Java dilinde tüm yazılan sınıflar Object sınıfından kalıtımlı olduğu için bu metoda da sahip olurlar.
Metotların Aşırı Yüklenmesi
C++ dilinde olduğu gibi Java dilinde de bir sınıfın metotlarının aşırı yüklenmesi süreci gerçekleştirilebilir. C++ dilindeki sınıf kopyalayıcılar Kendi tipinde değişkeni içeri alan aşırı yüklenmiş yapılandırıcılardır. Örneğin;
class SinifAdi{ //kodlar SinifAdi(SinifAdi s){ // sınıf kopyalayyan yapılandırıcı } }
Nesneler referanslar olarak metotların içerisine yollanırken primatif tipler değer olarak yollanır. Bu nedenle bir metot içerisinde herhangibir yollanan obje üzerinde değişiklik yaparsanız yolladığınız sınıfın sahip olduğu değerler değişir.
Erişim Kontrolü
Java üç çeşit erişim kontrolü sunar bunlar public, private ve protected’tir. Public bir sınıfın başka sınıfların erişimine açtığı veriler ve metotlar private ise sınıfın sadece kendi metotları ile erişilebilen metot ve fonksiyonlarıdır. protected yüklemi ise sadece paket içerisinden erişime izin verir.
Static Yüklemi
Java dilinde static anahtar sözcüğü özel bir yapıya sahiptir. Bu yüklem şu özellikleri taşır.
Statik olarak oluşturulan değişkenler globaldirler. Sınıf kopyalansa bile aynı bellek düğümünü (adresini) kullandıkları için birinde yapılan değişiklik diğerinde de işletilir.
Statik değişkenlere statik metotlar direkt erişebilir.
Statik metotlar sınıf belleğe yüklenir yüklenmez sıra ile çalıştırılırar. Bu nedenledir ki main static bir metottur. yani sınıf belleğe yüklendiği an otomatik olarak çalışır.
Statik değerler global olduğu için sınıfadı.statikdeğişken şeklinde ulaşmak mümkündür. Böyle ulaşarak yapılan değişikliğin aynı sınıftan olan tüm değişkenlerde gerçekleşmesini sağlamış olursunuz.
Final Sözcüğünün Değişken Deklerasyonunda Kullanımı
Final yüklemi önüne gelen değişkenler birdaha değerlerini değiştiremez bu nedenle ilk değer yüklenmelidir. Kaba kullanımı şu şekildedir.
final int A=10;
Metotlarda … Yüklemi
Bir metoda … kullanılarak bilden çok aynı tip girdi girmek imkanlıdır. Örneğin
boolean valCal (int ... a){ System.out.println ("yollanan değer sayısı" + a.lenght) for (int x : a) { //işlemler } }
Sınıflarda Kalıtım
Javada Sınıfların kalıtımının mantığında C++ mantığının tersine birşey görülmez Basit kalıtım yapısı şöyle kurulabilir.
class A extends B { // kodlar }
Görülebileceği gibi A sınıfı B sınıfına ait tüm özellikleri içerir. A sınıfı B’nın private üyelerine direkt erişemez.
super Yüklemi
Bu anahtar sözcüğün iki kullanım alanı vardır. Super ifadesi ata olan sınıfı işaret eder ve onun yapılandırıcısını çağırır. Bu çağırma genellikle türetilen sınıfın yapılandırıcısında gerçekleşir. Örneğin:
class A extends B { A() { super(); // kodlar }
super anahtar sözcüğünün bir diğer kullanımı ise this anahtar sözcüğüne benzer. Fakat bu uygulamada super bir üst sınıfı işaret eder.
Üst sınıfın metodunun alt sonofta devre dışı bırakılması işlemi sınıflarda ilgili metodun alt sınıfının aşırı yüklenmesi ile aynı C++ dilinde olduğu gibi gerçekleştirilir.
abstract Sözcüğü
Kimi durumlarda programcı sınıfın tamamen tanımlanmasını yapmak istemez ve metodu veya sınıfı boğ bırakmak ister. Bu durumda boş olan metotlar abstarct ön takısını alır. İçinde abstract metot bulunduran sınıfların önüne de abstract sözcüğü eklenir.
Abstract sınıflar tek başına kullanamazlar. Bu sınıfların kalıtımla alt sınıfları oluşturulur ve abstract metotlar aşırı yüklenirse bu alt sınıflar deklere edilebilir. Örneğin;
abstract class A { abstract void absMethot(int arg); int nonAbsMethot (int argc) { // kodlar } } class B extends A { void absMethot(int arg){ // kodlar } }
final Yükleminin kalıtımla ilişkisi.
Bu anahtar sözcük sadece değişkenlerin değişmesini önlemekte değil bir sınıftan türetilen bir sınıfın bir metodu aşırı yüklemesinin önelenmesinde de kullanılır. Örneğin;
class A { final void methot(int a){ // bu kodlar değişmez } }
bir diğer final yüklemi kullanım yeri de sınıfın kalıtımının önünün kesilmesi istendiğinde kullanılmasıdır. bu durumda şöyle kullanılır;
final class A{ // class kodları }
Kalıtımda Object Sınıfının Yeri
Java dilinin kendine özgü object adında bir sınıfı bulunur. Tüm sınıflar yaratılırken bu sınıftan kendiliğinden extend olurlar. Bu sınıfın şu metotları bulunur.
Object clone() boolean equals(Object Nesne) void finalize() Class getClass() int hashCode() void notifyAll() String toString() void wait() void wait(long milisaniye) void wait (long milisaniye, long nanosaniye)
toString nesnenin println ile de yazılabilen açıklamasını elde ederiz. equals objelerin eşit olup olmadığını elde etmeye yarar. wait, notfyAll, notify ve getClass final tipindedir yani aşırı yükleyemezsiniz.
Bir Sonraki Yazıda..
bu yazıya kadar olan bölümlerde standart bir C++ programcısının bilebileceği ve sadece Java değil tüm nesne yönelimli dillerde gördüğümüz temel özellikleri ile java dilini daha sözel bir şekilde anlattık. Daha önce de belirttiğim gibi bu yazı dizisi kendi anlayacağım gibi düzenlenmiş notlar bütünüdür. bu da temel bir C++ programcısının anlayabileceği düzeydir. Bu nedenle if, for gibi C dilinden miras kalan özellikleri veya temel düzeyde her programcının bilmesi gereken sınıf metot gibi kavramları yüzeysel olarak geçtik. Yazının bu noktasına kadar C++ ile farklı olan sözdizimlerine de kısa açıklamalar yaptık.
Bundan sonraki yazılarda karşılaşacağımız konular daha Javaya özgü olduklarından dolayı konu başlıkları daha yavaş ilerleyecektir. Java ilişkili temel yapıları tamamladıktan sonra da kimi Java paketlerine değineceğiz.
Bir sonraki yazı javada paket kavramını ve interface kavramını ele alacaktır.
Java Notlarım -3
Javada Primaif Veri Tipleri
java bizlere temel C++ veri tiplerinin aynılarını yani int, long, double, byte, float, char gibi tipleri barındırır. Bu tiplerin isimlerinin ilk harfleri küçüktür. Değişkenlerin isimlerinde yasaklı kelimeler haricinde kısıtlama yoktur. Fakat Uygulamada genellikle sınıf isimleri ile karışmamaları için küçük harfle başlamaları alışkanlık halinde programcılar tarafından benimsenmiştir. Java bunun haricinde boolen adlı bir tür daha barındırır, bu tür yanlızca true ve false değerlerini alabilir.
Tüm primatif tipler literal desteklidirler, Örneğin 1.2E-3 şeklinde kayar nokta veya C++’tada olduğu gibi excape karakterler karakter sizilerinde kullanılabilir.
Javadaki Primatif tiplerin bir de sınıf karşılıkları vardır. Örneğin int primatifinin karşılık geldiği sınıf Integer sınıfıdır. Bir liste ile verirsek;
int Integer long Long double Double byte Byte char Character float Float boolean Boolean
primatif tipler normal eşitliklerle karşılık sınıflarına taşınabilir. Bu işleme otomatik paketleme, tersine ise otomatik paketten alma denir.
Tip dönüşümleri hedef tipin eşitlikte parantez içinde yazılması ile yapılır. Örneğin;
int a; byte b; // işlemler b= (byte) a;
Tip dönüşümleri esnasında değerler kırpılabilir veya noktalı değerleri kaybolur. Hedef değişken tiplerindeki bu özelliklere dikkat edilmelidir.
Java dilinde tüm değikenler birer nesne gibi hareket eder. Fakat değişken tanımlamada C++ dilinden bildiğimiz pointer kavramı yoktur. Aslında javada tüm değişkenler referans olarak tutulur. Bu değişkenlerin sisteme geri verilme sürecinden programcılar sorumlu değildir. Java sanal makinesinin garbadge collection aracı bunu programcı için otomatik yapar.
Java dilinde operatörler.
Java dilinde operatörlerin C++ dilindekilerden hiç bir farkı bulunmamaktadır. Java aynı zamanda aritmatik atama (+= gibi) operatörlerini ve hızlı arttırma (a++ gibi) ve eksiltme operatörlerini de destekler.
Şartlı ifadelerde kullanılan ilişkisel operatörler C++ da olduğu gibi korunmuştur. Javada ayrıca alpha fonksiyon if de bulunur örneğin;
a = b==c ? d : e;
Bu ifadede b ve c sayıları eşitse a nın değeri d değilse anın değeri e olur.
Javada Kontrol İfadeleri
java programlama dili C++ da olduğu gibi aynen ve değiştirmeden if, if – else if – else, switch – case – break – defaullt ifadelerine destek vermektedir.
İteratif İfadeler
Java C++ programlama dilinde olduğu gibi while, do – while ve for ifadelerini kullanır. C++ dilinden farklı olarak Java programla dilini aynı zamanda for-each şekinde de kullanabilir. Buna göre;
for (tip itr-deger : colleksiyon)
şeklinde yapı tanımlanır.
İteratif İfadelerde ve Kontrol ifadelerinde kullandığımız break sözcüğü java dilinde aynı goto komutu gibi de kullanılabilir. bu durumda break etiket; şeklinde kullanılır.
Bir Sonraki Yazıda …
Sınıfların yapısı, new anahtar sözcüğü, metot kavramı, sınıf yapılandırıcısı, this sözcüğü, Atık toplama, Metotları aşırı yükleme,sınıflarda erişim kontrolü, static ve final sözcükleri, Kalıtım, super sözcüğü, Object sınıfı kavramlarına kısaca değineceiğiz.
Java Notlarım -2
Java Programları Nasıl Oluşturulur
Java programları düz bir metin editörü ile yazılabilir. Pek çok sistemde Java hazır olarak bulunmaktadır. bu yazıda nasıl kurulduklarına değinmeyeceğim. Zira binlerce yerde bu konulara değinilmiş. Amacımız hızlı özet bilgiler vermek.
Java programlarınızı dosya_ismi.java adı ile kaydedersiniz. Konsola javac dosya ismi değiniz taktirde java kodunuz derlenir ve class isimli dosya oluşur. Java programları java dosya.class komutu ile konsoldan çalıştırılabilir.
Java için En altın kurallar şunlardır.
Her sınıfınızın dosya adı sınıadı ile aynı olmalıdır. Yani dosya adları ile java komutları arasında bağıntı vardır. Benzel bağlantı paketlerde de bulunur.
Javada sınıf isimlerini verirken ilk harfi büyük geri kalanını küçük yapmayı tercih edin.
Java programları public stativ void main(String args[]) metodundan başlar. Bu aynı C++ programlarının main fonksiyonunu araması gibidir.
Aşağıda basit bir örnek görülebilir.
/* Açıklama Satırı */ class Simple { // ana program public static void main(String args[]) { System.out.println("Hello World"); } }
yukarıdaki programda System iletişimimiz sağlayan sınıftır.
IDE Seçimi
Java programlamayı tutup da komut satırları ile boğuşarak yapmak gerçekten çok yazık bir durumdur. Java dünyasında bizim için dosyaları düzenleyen tek tıklama ile derleme yapabilen unit test javadoc gibi konularda yardımcı olan güzel IDE’ler mevcut. Bunlardan ikisi ön planda
Netbeans
Sun firması tarafından yazılmıştır. Hızlı bir IDE’dir.
Eclipse
Açık bir IDE’dir. Java haricinde C++ Python PHP gibi birsürü dile desteği mevcuttur.
Biz uygulamarımızda eclipse kullanacağız. Bu yazının konusu eclipse kullanımı değildir. İnternette pek çok güzel eclipse videosu bulunmakta. Eclipse kullanmadan önce bilmeniz gereken temel kavramlar şunlar.
Java dünyası üçe ayrılmaktadır
J2SE
Bu masaüstü uygulamaları yazmaya yarayan kütüphaneleri barındırır. Başlangıç uygulamalarınız bu türdendir.
J2ME
Mobil aygıtlar için Java kodu yazmaya yarayan araçlardır
J2EE
Daha ziyada ağ uygulamaları yazmaya yarayan araçları barındırır.
Tüm java kodlarında packet mantığı vardır. Packetler genellikle işlevine göre web sitesi adına göre isimlenir. Eclipsede kod yazarken şu sıraya uyunuz (SE uygulamaları için) Önce paket yarıtınız örneğin com.okanakyuz.uygulama ve ardından main metotlu bir sınıf ekleyiniz. Artık üzerinde çalışabilirsiniz.
C++ bilenlere Java Notları
Açıklama satırları C++ da olduğu gibi /* ve */ arasına yazılabildiği gibi // ifadeleri ile de yazılabilir.
Tüm matematik işlemler pointersız yapılır. Java otomatik olarak nesneleri referanslar. Değişken tipleri aynıdır. Satır sonlarında ; bulunur.
if,for gibi ifadelerinin kullanımı aynıdır.
Java Anahtar sözcükleri
abstract (ilerde görülecektir) assert (ilerde görülecektir) boolean (c++ dan biliniyor) break (c++ dan biliniyor) byte (c++ dan biliniyor) case (c++ dan biliniyor) catch (c++ dan biliniyor, ilerde yeniden görülecek.) char (c++ dan biliniyor) class (c++ dan biliniyor) const (c++ dan biliniyor, ayrılmış fakat kullanımıyor) continue (c++ dan biliniyor) default (c++ dan biliniyor) do (c++ dan biliniyor) double (c++ dan biliniyor) else (c++ dan biliniyor) enum (c++ dan biliniyor) extends ( ilerde görülecektir) final (ilerde görülecektir) finally (ilerde görülecektir) float (c++ dan biliniyor) for (c++ dan biliniyor) goto (c++ dan biliniyor, ayrılmış fakat kullanımıyor ) if (c++ dan biliniyor) implements (ilerde görülecektir) import (ilerde görülecektir) instanceof (ilerde görülecektir) long (c++ dan biliniyor) native (ilerde görülecektir) new (c++ dan biliniyor) package (ilerde görülecektir) private (c++ dan biliniyor, ilerde yeniden görülecek.) protected (c++ dan biliniyor, ilerde yeniden görülecek.) public (c++ dan biliniyor, ilerde yeniden görülecek.) return (c++ dan biliniyor) short (c++ dan biliniyor) static (c++ dan biliniyor) strictfp (ilerde görülecektir) super (ilerde görülecektir) switch (c++ dan biliniyor) synchronized (ilerde görülecektir) this (c++ dan biliniyor) throw (c++ dan biliniyor, ilerde yeniden görülecek.) throws (ilerde görülecektir) transient (ilerde görülecektir) try (c++ dan biliniyor, ilerde yeniden görülecek.) void (c++ dan biliniyor) volatile (ilerde görülecektir) while (c++ dan biliniyor)
görüldüğü üzere pek çok komuta şimdiden vakıfız.
Bir Sonraki Yazıda…
Primatif veri tiplerine deyinilecek, Class değişken scope olayları anlatılacak,
değişken dönüşümü konusuna değilinecek, Dizilere bakılacak. Yapılabilen
operatörler anlatılacak. For döngüsünün for-each versiyonu gösterilecek.
Java Notlarım -1
Java Programlama Dili
Bu manuel ve seri olarak yazılmış tüm kodlar ve yazılar kendi en özet notlarım olup çeşitli kaynaklardan java üzerine çalısırken derlemiş olduğum bilgileri bir bütün halinde sunmayı amaçlamaktadır.
Java ve Tarihçesi
Java programlama dili C kökenli dillerin bir devamıdır. Zaten bu başlık altında ileride ve şimdi ekleyeceğim tüm yazıları anlayabilmeniz için C++ bilmeniz gerekmektedir. Bu şu anlama geliyor Zaten C++ programcısıysanız bu yazılar size
hızlı adaptasyon sağlayacaktır. Aksi taktirde OOP kuralları ve kavramlarına sıfırdan değinilmeyecektir.
C++ dili mirascısı olduğu C dili ve Obje kullanımı ile bir bütünlük taşımaktadır. C++ nesneye yönelimli programlama mantıkları kurabilmeyi ve böylece daha verimli kod yazabilmeyi hedeflemektedir. Java kodları şiddetli
şekilde C++ kodlarına benzer. C++ bu açıdan mükemmel bir programlama dilidir.
Javanın çıkışında en önemli devrim WWW dir. Java programlama dili Sun Microsystems bünyesindeki programcılar tarafından tasarlanmıştır. C++ ve diğer dillerle yazılmış programlar derlendikten sonra derlendikleri işlemciye bağımlı olarak çalışırlar. Java bu noktada platform bağımsız bir dil gerçekleştirmek amacı ile ortaya konmuştur.Java bunun hariinde felsefi bazı farklara sahiptir. C++ gibi java da profesyonel programlamaya yöneliktir. Yani ne yazarsanız onu elde edersiniz.
Bu benzer programlama etkileri C# dilinde de gözlenmektedir. İki dil aynı sözdizimine ve benzer yapılara sahiptir. Bu da javanın gücünü bir başka kanıtıdır.
Bazı Java Terimleri
Bytekode
Java programlama dili ile yazılan bir program derlendiğinde ortaya çıkan dosya komutlarıdır. Bu komutlar JVM gibi bir sanal makinede işletilebilir. Her sistem için JVM bir kere derlenir ve artık bu JVM ile tüm bytekodelar çalışabilir.
JVM
Java sanal makinesi de denir. Bytekodeların nasıl işletileceğini belleğin nasıl yönetileceğini vb konulara karar veren özel bir sanal işletim sistemi ve sistemdir.
Applet
Java ile yazılmış ve web sayfasına gömülmüş uygulamalardır. Populeriteleri kalmamıştır. Yerini daha çok flash animasyonları aldı.
Servlet
Server tarafında çalışan sunucu isteklerini yürüten java kodudur. CGI gibi bir mantığa sahiptirler.
OOP
Nesneye dayalı programlama demektir. Javada herşey nesnedir.
JSP
HTML kodları ile iç içe örülmüş java server taraflı kodlarıdır. Clinettan istek gelince hemen derlenir. Servletin bir sonraki noktasıdır.
JSF
java Server Faces Servletin bir sonraki adımıdır. Hem JSP hem de dinamik olarak web sayfasını yaratan birleşenleri yönetmeye imkan verir.
Java Beans
Java içinde ortaya konmuş bir çözüm ile iletişime geçmeye yarayan Javaya özgü bir evrensel kuraldır.
AWT
Appletr ve grafik arayüzlü java programlarında kullanılan kütüphane
SWING
AWT’nin gelişmiş bir halidir. Günümüz masaüstü java uygulamaları sıklıkla kullanır.
JAR
Birden çok sınıfın içerisinde Tar formatı ile bytecode halde yer aldığı yapıdır.
OOP Kavramlarını Hatırlayalım
Javanın temeli OOP’dir. Bu kavrama C++ dilinden aşınasınız fakat kısaca minik bir tekrar ile başlamak en iyisi olacaktır.
Abstraction
Belli bir sınıfın üyelerinin kullanıdığı temel arayüzler bulunmaktadır java dilinde bu kavram interface ile yürütülmektedir. C++ da bu işlem abstract class ile yürütülebilir.
Encapsulation
Javada sınıfa karşılık gelen kavramdır. Bir sınıf nesneler topluluğudur. Nesneler sınıf içerisinde tanımlı bir değişken veya metot (C++ değimi ile sınıfın fonksiyonu) olabilir. Sınıflardaki tüm yapılar public veya private olarak işaretlenebilir.
Inheritance
Bir sınıf başka bir sınıfın özelliklerini kalıtım yolu ile alabilir. Örneğin Tofaş Otomobiller sınıfından kalıtımla çoğaltılarak elde edilebilir. Bu durumda Otomobiller sınıfına superclass denmektedir.
Polymorphisim
Bir arabirim ile çok işlem yapmaya verilen isimdir. Örneğin aynı işlemin hem float hem de double bir değişkene yapılması durumunda karşılaşılır.
Polymorphisim aynı zamanda inheritance ile eş güdümlüdür. Türetilmiş her sınıf superclass’tan aldığı metotları yeniden işleyebilir.
Bir sonraki yazıda..
Programlarımızı nasıl derlediğimizi neler gerektiğini anlatacağız. Eclipse programını tanıtacağız ve ilk bir örnek gerçekleştireceğiz.
ilk GA programım
FGA ile birşey karaladım
//============================================================================ // Name : MGA.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C, Ansi-style //============================================================================ #include <iostream> #include <fga.hpp> #include <cstdlib> #include <cmath> using namespace std; using namespace fga; float myrnd(){ float x=rand(); return x/RAND_MAX; } float my_fitness_function(float *chromosome) { float x= *chromosome; return sin( x); } void my_mutate_chromosome(float *chromosome) { float myresult= *chromosome; if (myrnd() < 0.5){ myresult -= myrnd()/100; } else { myresult += myrnd()/100; } *chromosome = myresult; return; } void my_random_chromosome(float *chromosome) { *chromosome = myrnd(); } void my_crossover_operator(float *chromosome1, float *chromosome2) { float newchr1, newchr2; float oldchr1=*chromosome1; float oldchr2=*chromosome2; if (oldchr1 < oldchr2) { float newa; newa = oldchr2; oldchr2= oldchr1; oldchr1=newa; } newchr1 = ((oldchr1 + oldchr2) / 2) + ((oldchr1 - oldchr2) / 4); newchr2 = ((oldchr1 + oldchr2) / 2) - ((oldchr1 - oldchr2) / 4); *chromosome1=newchr1; *chromosome2=newchr2; } int main() { srand(time(NULL)); //Population<char> my_population(400, 1, my_fitness_function, NULL, NULL, my_crossover_operator, my_mutate_chromosome, my_random_chromosome, my_select_chromosome)); PopulationMT<float> my_population(1, 400, 1, &my_fitness_function,NULL,NULL,&my_crossover_operator,&my_mutate_chromosome,&my_random_chromosome,NULL); float mrate=0.1; float score = 0,sold=1; int count1=0; int count2=0; while(true){ my_population.cycle(); score=my_population.get_best_score(); count1++;count2++; if(mrate < 0.9 && count2/100){ mrate += 0.1; my_population.set_mutation_rate(mrate); count2=0; } if (count1==1100){ cout << "1100 oldu!!" << endl; break; } sold=score; cout << count1 << "\t" << score << endl; } return 0; }
derlerken -pthread yazmayı unutmayın
Benzetilmiş Tavlama
Forumlardan bir arkadaşın önerdiği Modern Sezgisel Teknikler ve Uygulamaları kitabını teğmin ettim. Dr. Tunçhan CURA yazmış. Tek tek konu başlıklarından örnekleri yapıyorken verdiği algoritmalardan biri olan Benzetilmiş Tavlama algoriitmasını C++ koduna çevirdim. Çoktandır web sitemde birşeyler yazmadığım aklıma gelince de yazdığım ufak örneği neden koymuyorum ki; merak eden hem bakar hem de ben arada hafızamı tazelerim diye düşündüm. Kod aşağıda yer almaktadır.
#include <iostream> #include <cmath> #include <cstdlib> #include <time.h> using namespace std; /* Optimize edilen fonksiyon */ float fonksiyon(float x) { if (x<=1) { return x*x; } else { float y= x-3; return (y*y) - 3; } } /* kucuk randomlar */ float kucukrandom() { float iletim= rand(); iletim = iletim / RAND_MAX; return iletim; } /* komsu çözüm */ float komsu(float i) { float ksayi; float isaret; isaret= kucukrandom(); if (isaret > 0.5) { ksayi = (kucukrandom() * i) + 1; } else { ksayi = (kucukrandom() * i) - 1; } return ksayi; } /* soğuma fonksiyonu */ float soguma(float sicaklik) { float yenisicaklik; yenisicaklik = sicaklik * 0.9; return yenisicaklik; } /* kontrol fonksiyonu */ float ptk (float fi, float fj, float t){ float p; p= fi-fj; p=p/t; p= exp(p); return p; } /* program */ int main() { srand(time(NULL)); cout << "Benzetilmis Tavlama" << endl; float i=kucukrandom() ; // baslangic degeri float t=800; //ısıtma float j; // yeni deger // algoritma while (t > 0.0001) { j=komsu(i); if (kucukrandom() <= ptk(fonksiyon(i),fonksiyon(j),t)) { i=j; } t=soguma(t); } // sonuc cout << "Cozum \t"<< i<< endl; return 0; }
Python Eric4 hatası ve güzelim eclipse.
Python çok esnek ve bir o kadar da sade bir dil. Şahsi görüşüme göre pythonun avantajları şunlar.
- Çok basit bir nesneye dayalı programlama dili olması. (javaya benziyor)
- Yazdığınız programların çok rahat okunabilmesi.
- Dilerseniz fonksiyonel programlama yapabilmeniz (Bu yönü ile haskell’e benziyor)
- Sunduğı liste objeleri (lispe benziyor)
- Öğrenmesinin kolay olması.
- C ile şahane konuşması.
Python IDE hususunda bir süredir debeleşiyorum. Denebilirki Kardeşim IDLE nene yetmiyor. Idle yetmiyor çünkü kod tamamlaması çalışmayan satırlar için kötü. Biraz araştırma yapıyorum ve güzelim ubuntumu (ki bir süre mecburen win32 kurdum) eric4 ile tanıştırıyorum. Sorunum şu: hata alıyorum, açılmıyor meret. Bug report maili atıyorum ve 2 haftadır bugı çözen yok. Daha önce win32de eclipsede python programladığım için bu mevluma geri dönüyorum.
Eclipse tespitime göre python konusunda iyi biride değil. Bunda kullandığım pydev sebep oluyor. Şuan PyQt4 uygulamalarım eclipsenin sempatik ama gereksiz kasan ekranında.