Yazilar:

 Sponsor Reklam 


20.09.2008 (07:39)

 static Anahtar Sözcüğü, Keyword 
Bir sınıfın nesnesini üretmeden onun bazı değişkenlerine veya metotlarına erişmek istiyorsak sınıfa ait bu üyeleri static olarak deklare etmemiz gerekmektedir.

Ana sınıfımızda yer alan main metodu da static olarak deklare edilmiştir. Yine aynı amaçla sınıfın örneğini üretmeden programı başlatabilmeyi sağlamakta, static tanımlı main metodunu çağırmaktadır.

Bildiğimiz main metodu:
public static void main(String[] args) {
  // Program çalıştırılınca doğrudan bu metot çağırılır
  // Burada diğer metotlar çağrılabilir
  // Sınıflara ait nesneler üretilebilir
}

static değişkenlere global değişkenler de diyebiliriz.

Eğer bir static değişkene hemen bir atama yapılmadan bazı hesaplamalar yapılarak atama yapılacaksa static blok kullanılmalıdır:

package kodcu.net;

class StaticDemo {

  static int x = 10;
  static int y;

  // Bu static metot degiskenleri carpar
  static int carp (int z) {
    return (x * y * z);
  }

  static {
    y = x + 2;
  }

  // Programda ilk çağrılan ana metodumuz
  public static void main(String[] args) {
    int sonuc = carp(2);
    System.out.println("Sonuç: " + sonuc);
  }

}

Ekran çıktısı şu olacaktır:
Sonuç: 240

Şurada sabit değişkenler için kullanılan final anahtar sözcüğünden bahsetmiştik. static keyword'ünün final ile kullanımı yaygındır. Örneğin Color diye sınıfımızda bazı renkler tanımlanmış olsun ve hem sabit anlamında final hem global anlamında static kullanıldığına dikkat edin:

package kodcu.net;

public class Color {
  public static final int BLACK = 0x000000;
  public static final int GRAY = 0xDDDDDD;
  public static final int WHITE = 0xFFFFFF;
}

Görüldüğü gibi 3 renk sabit ve küresel değişken olarak tanımlanmıştır. Şimdi başka sınıfta bu değişkenlerden birine erişelim ve onu kullanalım:

package kodcu.net;

import java.awt.Graphics;
import java.awt.Canvas;

public class ColorDemo extends Canvas {

  private int x; // x konumu, position x
  private int y; // y konumu, position y
  private int w; // genislik, width
  private int h; // yukseklik, height

  // Constructor
  public ColorDemo(int x, int y, int w, int h) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
  }

  // Bu metot cizim yapmayi saglar
  // Graphics sınıfından yararlanır
  // Dikdörtgen çizer
  public void paint(Graphics g) {
    // Renk ayarlanır
    g.setColor(Color.GRAY);
    // Dikdörtgen çizilir
    g.drawRect(x, y, w, h);
  }

}

Görüldüğü gibi Color sınıfının static final tanımlı global sabit değişkeninden faydalanılmıştır.
Imza: admin

19.09.2008 (20:25)

 İstisna Yönetimi, Exception 
Java tasarımı gereği çalışma zamanı hatası (runtime error) ile karşılaşılmayı büyük ölçüde önler. Hataları bulmamızı kolaylaştırır. Çalışma zamanı hatalarını da try - catch - throw - throws - finally anahtar sözcükleri ile, istisna yönetimi mekanizması ile denetim altına alır. Bu hatalara yine çalışma zamanında müdahale edilmesine olanak sağlar.

try bloğu hatayı içerebilecek kodu bulundurur. Eğer bu blok içinde bir istisna ile karşılaşılırsa catch bloğu tarafından yakalanmaya çalışılır. Eğer hata yakalanmamış ise bu istisna çağıran metoda veya sınıfa fırlatılır ve orada yakalanması beklenir. Hiç bir yerde yaklanmayan istisna hata kodu olarak dönülerek program sonlanır.

Örnek bir try - catch bloğu:

// Bu metot integer bölme işlemi yapar.
// Paydanın sıfır olması durumunda sonucu sıfır döndürür.
public int hesapla (int a, int b) {
  int result;
  try {
    result = a / b;
  } catch (ArithmeticException ae) {
    result = 0;
  }
  return result;
}

İstisna yaklama bloğunda birden fazla catch yapılabilir:

try {
  // İstisnaya yol açabilecek kod
} catch (ArithmeticException ae) {
  // Sıfıra bölme hatası yakalanır
} catch (ArrayIndexOutOfBoundsException e) {
  // Dizi sınırlarını aşmadan kaynaklanan istisna yakalanır
} catch (Exception e) {
  // Herhangi bir yakalanamayan istisna varsa onu yakalar
  // Hata satırını yazdıralım
  e.printStackTrace();
}

Tüm istisna sınıfları Throwable sınıfını genişletir, yani onun alt sınıfıdır. Throwable'ın bir alt sınıfları Exception ve Error sınıflarıdır. Kendimiz Exception sınıfını genişleterek kendi istisna sınıflarımızı oluşturabiliriz. Ancak Error sınıfı bellek yetersizliği, yığın taşması vs. hataları içerir ve programımız tarafından yönetilemez.

throw anahtar sözcüğü ile manuel olarak istisna fırlatılabilir:

throw new NullPointerException("Deneme");

Eğer bir metot yönetemeyeceği bir istisna içerebilecekse kendisini çağırana bu istisnayı fırlatabilmesi için throws anahtar sözcüğü tanımlanmıştır:

package kodcu.net;

public class IstisnaOrnek {

  public static void main(String[] args) {
    try {
      run();
    } catch (RuntimeException e) {
      System.out.println("Çalışma Zamanı Hatası!");
    }
  }

  // İstisnaya neden olan ve yönetmeyen metot
  public static void run()  throws RuntimeException {
    throw new RuntimeException();
  }
}

RuntimeException sınıfı sıfıra bölme, dizide indis aşımı yapma gibi birçok çalışma zamanı hatasını denetleyebilen bir sınıftır.

İstisna yönetiminde try, catch blokları gibi bir de finally bloğu vardır. finally anahtar sözcüğüne şu yazıda değinilmiştir.
Imza: admin

19.09.2008 (02:12)

 native Anahtar Sözcüğü, Keyword 
Başka dillere ait programları kullanmak istersek Java buna Java Native Interface (JNI) mekanizması ile izin verir. Bu amaçla native anahtar sözcüğü kullanılmaktadır.

Doğal (native) bir metot şu şekilde deklare edilir:

public native int hesapla();

Görüldüğü gibi metodun gövdesi yoktur. C'de yazılmış bir programı çağırmak için JNI kullanılmaktadır. Öncelikle native metodu tanımladığımız yerde DLL yuklenmelidir.

NativeDemo class'ı içinde yer alan bir örnek:

public native int hesapla();
static {
  System.loadLibrary("NativeDemo");
}

System sınıfının loadLibrary() metodu static olarak tanımlanmıştır, bu nedenle de static blok kullandık. NativeDemo ile belirtilen de Windows için .DLL uzantılı varsayılan dosyadır.

NativeDemo.h'ı üretmek için javah.exe kullanılmaktadır. javah.exe'nin yeri SDK (veya JDK) içinde bin klasörü altındadır. Şu komut ile NativeDemo.h üretilir:

javah -jni NativeDemo

Tabi bunun gerçekleşebilmesi için öncelikle NativeDemo.java'nın derlenmiş olması ve class'ının üretilmiş olması gerekmektedir. Sonuç olarak elde edilen NativeDemo.h, derleyici tarafından otomatik olarak oluşturulan jni.h kütüphanesi de include eder:
#include <jni.h>
Ayrıca şu fonksiyonu da prototip olarak tanımlar:
JNIEXPORT void JNICALL Java_NativeDemo_hesapla (JNIEnv *, jobject);
Şimdi NativeDemo.h NativeDemo.c olarak oluşturulan dosyada include (dahil) edilebilir.

NativeDemo.c:
//Kütüphaneler dahil edilir
#include <jni.h>
#include <stdio.h>
#include "NativeDemo.h"

// İşlev yapacak fonksiyon yazılır
JNIEXPORT void JNICALL Java_NativeDemo_hesapla (JNIEnv *env, jobject obj) {
  printf("Native Metot Çağrıldı");
}

Son olarak elde edilen NativeDemo.c dosyasından loadLibrary() metodunun anlayacağı NativeDemo.dll dosyasının üretilmesi gerekmektedir. Bunun için de C/C++ derleyicileri kullanılır. Şu komut çalıştırılır:
Cl /LD NativeDemo.c

Komutlar çalıştırılırken ilgili dosyaların olduğu yerler, (path'ler) seçilmelidir.

Native metotların dezavantajları şunlardır:
* Doğal (native) metotlar Java programına dahil edildikleri için buralarda yapılacak değişiklikler güvenlik sorunları çıkarabilir.
* Doğal (native) kod DLL içinde tutulduğu için işletim sistemine ve CPU'ya bağımlıdır. Bu nedenle native metotların kullanıldığı Java programları taşınabilir değildir.
Imza: admin

18.09.2008 (20:02)

 volatile Anahtar Sözcüğü, Keyword 
Bazı durumlarda, özellikle çok kanallı programada bu anahtar sözcüğe ihtiyaç duyulmaktadır. Bildiğimiz üzere derleyici (compiler) kod üzerinde optimizasyon yapmaktadır. İşte bazen derleyicinin optimizasyon yapmaması, yazılan kodun olduğu gibi çalışması istenmektedir.

Şu örnek incelenirse,
char KEYBOARD;
char c;
for (int i=0; i<10; i++) {
  c = KEYBOARD;
  copy(c);
}
derleyici for içinde yer alan işlemlerin değişmediğini düşünüp for'un dışına alabilir ve for'u kaldırabilir (loop invariant optimization):

char KEYBOARD;
char c;
c = KEYBOARD;
copy(c);

Oysa çok kanallı programlamalarda proseste (process) birçok thread o koda erişmek isteyecek ve kendine göre değiştirecektir. Bu nedenle
c = KEYBOARD;
satırı birçok kanaldan çağrılmak istenecek ve bir başkası bir yerlerde KEYBOARD'a atama yapabileceğinden değerler farklı olabilecek. Bu nedenle optimizasyon yapılmasını önlemek için şu şekilde tanımlama yapılmaktadır:

volatile char KEYBOARD;

Artık volatile olarak belirtilmiş KEYBOARD ile olan işlemlerde optimizasyon yapılmayacaktır.
Imza: admin

18.09.2008 (06:46)

 strictfp Anahtar Sözcüğü, Keyword 
Java 2'de kayan noktalı (floating point) hesaplama işleri daha kolaylaştırıldı ve bu nedenle hızlandırıldı. Eski sistem gibi çalışması isteği için de strictfp (FP-strict) anahtar kelimesi eklendi.

Bu anahtar sözcük, hem sınıflara hem metotlara uygulanabilir. Sınıfa uygulanırsa içindeki tüm metotlara uygulanmış olur. Bu anahtar sözcük floating işlemlerin IEE 754 standartlarına uygun yapılmasını garanti eder.
Imza: admin

18.09.2008 (06:20)

 instanceof Anahtar Sözcüğü, Keyword 
instance anahtar sözcüğü bir nesnenin bir sınıfa ait olup olamayacağını veya ona dönüştürülüp dönüştürülemeyeceğini (cast) anlamamızı sağlar.

package kodcu.net;

class A {
  int i, j;
}

class B {
  int i, j;
}

class C extends A {
  int k;
}

Şeklinde tanımlanmış sınıfların nesneleri için instanceof şu şekilde kullanılabilir:

A a = new A();
B b = new B();
C c = new C();

if (a instanceof A) {
  System.out.println("a is an instance of A");
}

if (b instanceof A) {
  System.out.println("b is an instance of A");
}

if (c instanceof A) {
  System.out.println("c can be cast to A");
}

Çıktı şu şekilde olur:

a is an instance of A
c can be cast to A

Karmaşık sınıf hiyerarşisinin olduğu yerlerde instanceof kullanımı fayda sağlamaktadır.
Imza: admin

18.09.2008 (02:07)

 final ve finally Anahtar Sözcükleri, Keywords 
final anahtar sözcüğü, değişkenin içeriğinin değiştirilmesi engellemek için tanımlanmıştır. Bu değişkenler sabit değişkenlerdir ve C, C++ veya C# dillerindeki const ifadesine benzer.

final değişkenlerine bir ilk değer ataması yapılması zorunludur. Ayrıca bu değişken isimlerinin büyük harfle yazılması yaygın kullanılmakta ve tavsiye edilmektedir.

Örnek bir final değişken:
final double PI = 3.141592653589793;

final keyword'ü değişken tanımı dışında kalıtım'da da (inheritance) kullanılmaktadır. Burdaki kullanımı, metotların geçersiz kılınmasını (method overriding) önlemek içindir. Eğer geçersiz kılınmak istenirse derleme zamanı hatası (compile time error) ile karşılaşılır. Bunun dışında bir de sınıfların türetilmesini (genişletilmesini) önlemek amacıyla kullanılmaktadır.

final class A {
  // tanımlamalar
}

A sınıfı final olarak tanımlandığı için onun alt sınıfı oluşturulamaz. Bu nedenle şu örnek yanlış olur:

class B extends A {
  // tanımlamalar
}

final bir değişken ya da metot performans artışı sağlar. Bu değişkenler bellekte örnek başına yer tutmaz. Bu nedenle de sabit olmak zorundadır. Metotlara yapılan çağrılar çalışma zamanında dinamik olarak çözülür (dynamic binding). Buna geç bağlama (late binding) da denir. Ancak final metotlar geçersiz kılınamadığı için bunlar için yeni bytecode'lar oluşturulmaz ve bu nedenle zaman kaybı olmaz. Bu metotlara yapılan çağrılar bu nedenlerle derleme zamanında çözümlenebilir. Bu bağlamaya da erken bağlama (early binding) olarak nitelendirilir. Bu şekilde performans artışı sağlanmış olur.

finally anahtar sözcüğü ise istisna (exception) yönetiminde try - catch mekanizmasında yapılacak olan son işlemi içeren bloğu oluşturur.

Şu örnek finally kullanımını görüyoruz. Metot, a ve b sayıları için tam sayı bölmesi yapıp sonuca b'yi ekler. Sıfıra bölme durumunda ise sıfır döndürür:

public int bolTopla(int a, int b) {
  try {
    a = a / b;
  } catch (ArithmeticException ae) {
    a = 0;
    System.out.println("Bölme Hatası Oluştu");
  } finally {
    a = a + b;
  }
  return a;
}

Imza: admin

17.09.2008 (01:34)

 this ve super Anahtar Sözcükleri, keywords 
Bir sınıf içerisindeki değişkenler ile metotta yer alan aynı isimde değişkenlerin karışmaması için this anahtar sözcüğü kullanılır. Şu örnekte kullanımını görebilirsiniz:

package kodcu.net;

public class Rectangle {

  private int rectangleWidth;
  private int rectangleHeight;

  // Constructor
  public Rectangle(int rectangleWidth, int rectangleHeight)  {
    this.rectangleWidth = rectangleWidth;
    this.rectangleHeight = rectangleHeight;
  }
 
  // This method calculates rectangle's area.
  public int calculateArea() {
    return (rectangleWidth * rectangleHeight);
  }

}

Görüldüğü gibi this keyword'ü yapılandırıcıda (constructor) parametre olarak alınan değişkenler ile sınıfın değişkenleri aynı isimdedir. Bunların karışmaması this kullanılmıştır. Constructor şu şekilde de kullanılabilir:

  // Constructor
  public Rectangle(int width, int height)  {
    this.rectangleWidth = width;
    this.rectangleHeight = height;
  }

Ya da şu şekilde de kullanılabilir:

  // Constructor
  public Rectangle(int width, int height)  {
    rectangleWidth = width;
    rectangleHeight = height;
  }

super kullanımı ise alt sınıfların üst sınıfa ait private olmayan üyelerine erişmede kullanılmaktadır. Bildiğimiz üzere overriding ile üst sınıfların metotları geçersiz kılınmaktadır. Fakat üst sınıfın bu gizlenen metotlarına ulaşmak istiyorsak super anahtar sözcüğü ile bunu yapabiliriz. Yine benzer şekilde üst sınıfa ait constructor'a da super() çağrısı ile erişebiliriz. Kendi sınıfına ait constructor'a ise this() çağrısı ile erişilebilir.

Şu başlıkta yer alan örnekte super ve this kullanımları da yer almaktadır.

Şu şekildeki bir çağrı da daha üst sınıflardaki metota yapılan bir çağrı örneğidir:
super.super.super.getWidth();

Şu örnekte de this'in farklı bir kullanımı görülmektedir:
public class A {

  private B b = new B(this);

  // Constructor
  A() { }

}
b nesnesi oluşturulurken onun yapılandırıcısına sınıfın nesnesi gönderilmektedir. this ile belirtilen kendi sınıfının (A'nın) bir örnek kopyasıdır.
Imza: admin

16.09.2008 (03:36)

 Paketler, Sınıflar ve Nesneler 
Sarmalamanın temelinde sınıf (class) mantığı bulunmaktadır. Sınıf, nesneleri tarafından paylaşılan yapı ve davranışı içerir. Sınıf içinde değişkenler, nesne-örnek değişkenler, metotlar yer alır. Hatta sınıf içinde sınıf tanımlaması (inner class - nested class) da yer alabilmektedir. class anahtar sözcüğü ile tanımlanır.

Nesne (object) ya da örnek (instance) olarak nitelendirdiğimiz ise temsil ettiği sınıfın üyelerini taşır. Bu üyeler bahsettiğimiz değişkenler, metotlardır. new operatörü ile nesneler oluşturulmaktadır.

Paket ise yazılan kodların bulunduğu yerdir. Başka bir yerdeki kod o paket dahilinde değildir. Eğer kullanılması gerekirse import edilmesi (dahil edilmesi) gerekmektedir. package anahtar sözcüğü ile paketin ismi belirtilir.

Konuyla ilgili şu örnek açıklayıcıdır:
package kodcu.net;

import java.util.Hashtable;

public class Deneme {

  // Hashtable sınıfından nesne oluşturalım.
  private Hashtable hashtable = new Hashtable();

  public void addValue(Object key, Object value) {
    // hashtable'a key ve value değerini ekler
    hashtable.put(key, value);
  }

}

Bu kodun bir fonksiyonu yoktur. Fakat paket, sınıf, nesne tanımlamaları örnekte görüldüğü şekilde yapılmaktadır.

Şu unutulmamalıdır ki, sınıf mantıksal bir yapıdır. Nesne ise fiziksel bir gerçekliğe sahiptir. İnsan sınıfından olmamız kümeleme, sınıflandırma, aynı özellikleri aynı yerde ifade etme şeklidir. Oysa her bir kişi olarak bir adımız, soyadımız, boyumuz, ağırlığımız yani elle tutulur, gözle görülür bir yanımız vardır. Bu nedenle biz, İnsan sınıfının bir nesnesiyiz ve o sınıfın özelliklerini taşırız; koklama, koşma, yürüme, yüzme metotlarını da yerine getiririz.
Imza: admin

16.09.2008 (00:29)

 Aşırı Yükleme Overloading, Geçersiz Kılma Overriding 
Java'da çok biçimlilik program yazmayı kolaylaştırırken, anlaşılabilirliği artırmakta, diğer yandan karmaşıklığı azaltmaktadır. Aşırı yükleme (overloading) ve geçersiz kılma (overriding) ile çok biçimlilik sağlanmış olur.

Aşırı yükleme ve geçersiz kılma ile ilgili şu yazıda bahsedilmiştir.

Ayrıca şuralara bakılabilir:
Method Overloading
Method Overriding
Imza: admin

 1  ··  8   9   10 








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter