Java'da Non-Access Member Modifiers nedir?
Class Üyelerinin Tanımlanması(Non-Access Member Modifiers)
Herkese merhabalar. Bu yazımızda class yapısının üyelerini erişim belirleyicilerinden non-access modifier detaylı açıklayacağız.
Bir classtan gelen kodun başka bir classtan bir methodu çağırıp çağıramayacağını (veya bir örnek değişkene erişip erişemeyeceğini) ifade eden üye erişimlerini açıkladık.
Şimdi de diğer belirleyicileri açıklamaya çalışağız.(final, abstract,static,transient , synchronized , native , strictfp)
Final Method
Bir final anahtar sözcüğü ile bir metot veya variables tanımladığımızda bu metot veya variables yapısına başka bir classtan erişim mümkündür fakat override(üzerinde değişiklik yapma) edilemez. Yani final olarak tanımladığımız yapıyı koruma altına almış oluruz.
class Roman{
public final void kitapOku() {
System.out.println(“Bir roman oku”);
}}
//****************************************
class Hikaye extends Roman{
public void kitapOku() {
// kitapOku classını override etmeye çalışıyor
System.out.println(“Bir hikaye oku.”);
}}
Yukarıdaki kodu çalıştırdığımızda derleyici hata verir. Çünkü Hikaye classında bulunan kitapOku() override edilmeye çalışılıyor. Oysaki metot yukarıda final olarak tanımlanmıştır.
Final argümanları
public Kayit kayitGetir(int dosyaNo, int kayitNo) {}
Public bir method yukarıdaki gibi tanımlanabilir.Bir methodun aldığı parametreler final olabilir.
public Kayit kayitGetir(int dosyaNo, final int kayitNo) {}
Bu sayede kayitNo değiştirilmeden kullanılması gereklidir.
Abstract Methotlar
Bir abstract metot için, bildirilen ancak uygulanmayan metot diyebiliriz.Başka bir deyişle metotlar hiçbir işlevsel kod bulundurmaz.Metotu kullanmak isteyen classlar içini doldurarak kullanırlar.
Eğer metotlar abstract yapılırsa alt sınıflar(subclass) metotların içini doldurup kullanmak zorundadırlar.
Abstract classlar süslü parantez ile yapılırken abstract metotlarda süslü parantez({}) yoktur, noktalı virgül (;) kullanılır.Örneğin,
public abstract void ornekSoyutMetot();
Peki metot ile abstract metotu nasıl ayırt edebiliriz?Bu konuda 3 bilgi vereceğiz.
■ Metot abstract olarak işaretlenmez .
■ Metot tanımı süslü parantez içerir, noktalı virgül içermez.
■ Metot, uygulanacak kodu içerir.
Önemli:Bir class, bir Abstract classı katılım olarak alırsa onun içindeki abstract metotları almak ve içeriğini doldurmak zorundadır.(Tüm üst sınıflarında bulunan abstract metotları dahil).
Örneğin
public abstract class Arac {
private String tip;
public abstract void hizlanmaDurumu(); // Abstract method
public String tipGetir() // Non-abstract method
{
return tip; }}
public abstract class Araba extends Arac {
public abstract void hizlanmaDurumu(); // abstract zorunlu
public void arabaTipi() {
//metot içeriği
}}
public class MiniCooper extends Araba {
public void hizlanmaDurumu() { //zorunlu içini doldurman lazım
// özel kod
}
}
MiniCooper sınıfı kaç tane metoda sahiptir? // 3 tane metoda sahiptir.
hizlanmaDurumu() //kullanması zorunlu abstract metot , arabaTipi(),tipGetir() public ve dolu metotlar
Farklı bir örneğe bakalım.
public abstract class A {
abstract void sebze();
}
class B extends A {
void sebze(int I) { }
}
Bu classlar derlediğinde hata alır.Çünkü abstract sebze sınıfını kullanmamıştır.
Parametreli olarak kullandığı metot(sebze), overloading(aşırı yükleme) olarak geçmektedir.
Doğrusu parametresiz Sebze() olarak kullanılması gerekir.
Birkaç duruma da değinelim.
■ Bir metot asla ve asla final abstract olarak kullanılamaz.
■ Bir metot aynı anda abstract ve private olarak kullanılamaz.
Abstract metotlar overriden yani içerik oluşturarak kullanılması şarttır.Fakat private ve final olursa kullanılamaz duruma düşer. final olarak yapılan metot tüm alt sınıflar değiştirilmeden kullanılması anlamına gelir.Fakat Abstract metot tam tersi alt sınıf baştan oluşturarak kullanmalıdır.
■ Bir metot abstract static olarak kullanılamaz.Derleyicide compiler hatası alır.
Static metotları detaylı olarak başka yazımızda açıklayacağız.
Örnek bir abstract static tanımladığınızda aşağıdaki hatayı alırsınız.
Class.java:2: illegal combination of modifiers: abstract and
static
abstract static void isYap();
Synchronized Methods
synchronized anahtar sözcüğü, bir metoda aynı anda yalnızca bir iş parçacığı tarafından erişilebileceğini belirtir. synchronized değiştiricinin yalnızca metotlara uygulanabileceğini bilmek gerekir( değişkenlere değil, sınıflara değil, sadece metotlara). Aşağıdaki gibi tanımlanır.
public synchronized Kayit sesiAl(int kayitNo) { }
Native Methods
native modifier, bir metotun platforma bağlı kodda, genellikle C’de uygulandığını belirtir. Native modifier’ın bir değiştirici (dolayısıyla ayrılmış bir anahtar kelime) olduğunu bilmek dışında, native modifier yalnızca metotlara uygulanabilir(classlara değil, değişkenlere değil, yalnızca metotlara). native bir metodun gövdesinin, uygulamanın atlandığını gösteren bir noktalı virgül (;) (soyut yöntemler gibi) olması gerektiğini unutmayın.
Strictfp Methods
Daha önce class değiştirici olarak strictfp kullanmaya baktık, ancak bir classı strictfp olarak bildirmeseniz bile, yine de tek bir metotu strictfp olarak bildirebilirsiniz.
Unutmayın, strictfp floating points (ve tüm floating points işlemlerini) IEEE 754 standardına uymaya zorlar. strictfp ile, JVM’nin üzerinde çalıştığı temel platformdan bağımsız olarak floating points’in nasıl davranacağını tahmin edebilirsiniz.
Dezavantajı, eğer temel alınan platform daha fazla kesinliği destekleyebiliyorsa,bir strictfp yöntemi bundan yararlanamayacak.
Methods with Variable Argument Lists (var-args)
Java, değişken sayıda argüman alabilen yöntemler oluşturmanıza izin verir.
Aynı tipte birden fazla parametre girmemize izin verir.
Kullanılan Legal Yöntem:
void islemYap(int… x) { }
// sıfırdan istediğimiz kadar int parametre geçilir.
void islemYap2(char c, int… x) { } // bir tane char parametresi ,
// sonra 0’dan istediğimiz kadar int parametre
void islemYap3(Araba… araba) { }
// 0 ‘dan İhtiyac kadar araba tipinde Parametre
Illegal kullanımlar:
void islemYap4(int x…) { } // kötü syntax
void islemYap5(int… x, char… y) { } // birden fazla var-args
void islemYap6(String… s, byte b) { } // var-arg sonra olamaz.
Yazımızdaki Kodlar ve daha fazlası sitemizde yeralmaktadır. http://latestsoftwaredevelopers.com/
Bu yazımızın burada sonuna geldik. Bir sonraki yazımızda görüşmek dileğiyle. Constructor yapılarını detaylı anlatacağımız bir sonraki yazımız öncesinde bizi takip etmeyi unutmayın