Declare Class and Declare Interface

Merhaba arkadaslar,

bu yazımda sınıf ve arabirim tanımlamasına değiniceğim. Öncelikle source file declarasyon kurallarını bir hatırlayalım;

  • Bir source kod içerisinde yalnız bir tane public class bulunabilir.
  • public class ismi ile dosya adı aynı olmalıdır.
  • Eğer herhangi bir pakete ait ise sınıf, source koddaki ilk ifade paket ifadesi olmalıdır.
  • Bir sınıf yalnız bir paket ifadesi içerebilir.
  • import ifadesi ; paket ifadesi ile sınıf deklarasyonu arasında olmalıdır.
  • Eğer herhangi bir pakete ait değilse sınıf, source kod icerisinde ilk ifade import ifadesi olmalıdır.
  • import ve package ifadesi tüm source kod için uygulanır.
  • Birden fazla non-public sınıf içerebilir.
  • public sınıf bulunmuyorsa eğer dosya isminin herhangi bir sınıf ismi ile aynı olması gerekmez.

Class Declaration

Yukarıdaki şekilde en basit bir sınıf tanımı yapabiliriz. Önerilen sınıf tanımı ise şu şekildedir;

* Yukaridaki boş sınıf compile olacaktır. Class tanımından önce modifiers tanımlayıcı ekleyebiliriz. Modifiers iki kategoriye ayrılmaktadır. Bunlar;

  • Access modifiers : public ,protected ,private.
  • Non-access modifiers : strictfp, final, abstract.

İlk olarak access modifiers’lara bakalım. Java’da 3 access modifiers ve 4 access level vardır. 4.cü access level default yada package access olarak adlandırılır. Eğer yukarıdaki 3 erişim belirtecinden birini kullanmaz isek default(package) olarak access level’a sahip olunacaktır.

Kısaca; Tüm class, instance variable ve method access control’a sahiptir. Açık olarak tipi belirtilmemiş olsa bile.

Yukarıdaki 4 erişim seviyesi(3 erişim tipi var dedik) method ve instance değişkenler için geçerlidir. Sınıflar için ise public ve erişim tipi belirtilmemiş ise default access vardır.

Class Access ne anlama gelmektedir ona bakalım;

İki sınıfa sahip olduğumuzu düşünelim; A ve B sınıfları. A sınıfı şu 3 şeyi gerçekleştirebilir;

  1. B sınıfından bir instance oluşturmak.
  2. B sınıfını extends etmek.
  3. B sınıfı içerisinde method ve instance değişkenlere erişmek.

Sonuç olarak; B sınıfı, A sınıfında visible’dır denir. Eğer B sınıfı A sınıfında görünmüyorsa B sınıfı içerisinde method ve değişkenlerde görünmezdir. Sınıf erişilebilinirliği, member(sınıf-üyesi) erişilebilinirliğinden önce gelir.

Default Access : Eğer access modifiers olarak public belirtmezsek sınıf access leveli default olacaktır(package-level). Yukarıdaki örneğimizde B sınıfın public olmadıgını ve farklı pakette bulunduğunu varsayalım. Bu durumda A sınıfı B sınıfını göremeyecektir. Default access olan bir sınıfa sadece aynı paketteki sınıflar tarafından ulaşılabilinir. Yukarıdaki verdiğim A sınıfının gerçekleştirebileceği 3 şey artık gerçekleştirilemez olacaktır. Bunu çözmenin ise iki yolu vardır; Aynı paket içerisine koymak sınıflar yada B sınıfını public yapmak.

 

Public Access : public tanımlı bir sınıfa aynı ve farklı paketler altından (her yerden) erişilebilinir. Farklı paketlerde bulunuyor ise import edilerek ulaşılabilinir. İnstance olusturma yada extends etme(sınıf final olmamak şartıyla) artık gerçekleştirilebilinirdir.

 

Non-Access modifers

Access modifiers’a ek olarak non-access modifiers eklenebilir sınıf tanımında. Sınıf tanımında kullanılan access modifiers tipine bakılmaksızın strictfp, final ve abstract eklenebilir sınıf tanımına. Örnek olarak; public final MyClass {..} diyebiliriz. Bunları mix de yapabiliriz. strictfp ve final combinasyonu her şekilde yapılabilir. Ancak nonaccess modifierslar her zaman birlikte kullanılamazlar.

abstract ve final  asla yanyana gelemez. Daha sonra neden gelemediğine detaylıca değiniceğim.

Strictfp strictfp modifiers sınıf ve methodlara uygulanabilir. variables’lara uygulanamaz. Eğer sınıf tanımında strictfp kullanılırsa sınıfımız kayan noktalı sayılar için IEEE 754 standartlarına uyumlu olacaktır. Kayan noktalı sayılar plaform dependent olduğu için strictfp kullanılabilir.

Final Classes : Sınıf declarasyonunda final keyword’unu kullanabiliriz. final olan bir sınıf extends edilemez. Yani subclass’ı olamaz anlamındadır. final class’lar genelde güvenlik amaçlı kullanılır. Bu sayede sıfının subclassı olamayacak ve methodlar override edilemeycektir. Örn; String sınıfı final’dır. Eğer String sıfınını extends edebilseydik dogru calısacagını yada bozmayacagımızın garantisini kim verebilirdi ki . OO dizaynında çok fazla final kullanmak kötü bir yaklaşımdır. OO’nun genişletilebilir özelliğini azaltır.

Abstact Classes : Absract olan bir class’dan instance oluşturulamaz. Abstract classın amacı extends edilmektir. Çünkü sınıf soyuttur. Örnek; Bir Car sınıfımız olsun. Araçlar için bazı ortak özelliklere sahiptir Car sınıfımız. color, horsepower vs. gibi özelliklerin nasıl ve ne şekilde olacağı belli değildir. Diger bir deyişle; methodların nasıl impelemente edileceği belirsizdir.

Sınıfmızdan nesne oluşturmak istediğimizde compile error oluşacaktır.

* Yukarıda abstact methodun {} yerine ; ile bittiğine dikkat edelim.

* public abstract public Car yada abstract public class Car iki tanımda geçerlidir.

* Abstract sınıflar gövdeli yada gövdesiz methodlar içerebilir. Eğer tek bir gövdesiz methoda bile sahip ise sınıfında abstract olması gerekmektedir. Çünkü içi boş olan bir methoda sahip sınıftan obje oluşturmak mantıksızdır. İçi boş methodun yapacağı bir işlev yoktur.

*  Abstract sınıfı extends eden ilk concrete yani somut sınıf içi boş methodların gövdesini yazmak zorundadır.

Declare Interface

İnterface bir kontrattır. Ne yapılacağını söyleyip nasıl yapılacağını söylememektir. Şu tanım 10 numaradır ;

* İnterface sadece gövdesiz methodlara sahiptir. Abstract sınıflar iki türlüsüne de sahip olabilir.

* İnsterface’ler %100 abstractır.

* C++ içerisinde çoklu kalıtım kullanılabilir. Anca Java bunu desteklemez, Java single inheritance yapısını destekler. Çoklu kalıtım karmaşık olarak göründüğünden Java’ya dahil edilmemiştir. Anca interface yapısı ile bunu yapmamız mümkündür. İnterface’nin gücü buradan gelmektedir. Birbiri ile ilişkisi olmayan sınıflar aynı arabirimi implemente edebilir. Aynı zamanda bir sınıf birden fazla arabirimi implemente edebilir.

İnterface’i implemente eden sınıflar methodların ne yapacağını yazmak zorundadırlar.  Bounceable interface’inde  bounce() and setBounceFactor() methodlarının olduğunu varsayalım. Bounceable’ı implemente eden sınıflar bu iki methodun içini yazmak zorundadırlar.

* İnterface’ler, kalıtım hiyerarşisine bakılmaksızın her sınıf tarafından implemente edilebilir. Farklı sınıfların aynı karekteristik özellii gösterdiği durumlarda kullanılabilir. Ball ve Tire sınıflarımızın ortak özelliği bounce behavior’una sahip olmalarıdır. Nasıl zıplayacakları belirtilmemiştir Bounceable arabiriminde.

2014-12-19 02:20:50

* Yukarıdaki resme bakarak birseyler çıkarabiliriz. Methodlar default olarak public ve abstract olarak işaretlenir. Kombinasyonu önemsizdir. İnterface methodları abstract olduğu için final olamazlar. Aynı zamanda static de olamazlar. private yada protected access modifers da alamazlar. strictfp ve native(fsonra değineceğim) de olamaz.

* İnterface instance değişkene sahip değildir. Ama daha çok instance değişken yerine constant’a sahiptir.

* İnterface değişkenlerinin sabite(constant) olduğunu söylemiştik. Buradaki public static ve final üçlüsünün her kombinasyonu doğrudur. İnterface constantları impelemente edilen sınıf içerisinde değeri değiştirilemez. Constant olduğu için declaration anında da değerinin verilmesi gerekmektedir. Aşağıdaki tanımlamaların hepsi legaldir.

 

Ek interface kuralları;

  • Bir interface başka interface’leri extends edebilir. Yada daha fazlasını extends edebilir.
  • interface başka bir interface^yi implemente edemez.
  • interface declarasyonunda abstract kullanılabilir;

 

Yazımı burada bitiriyorum arkadaslar. Daha sonra tekrar değineceğim bu konulara.

Mutlu kalın, Kod’la kalın ve bol bol Çay için. Çay önemli

~ Alican Akkuş

 

1256 Total Views 1 Views Today