Kalıtım ile ilgili makalede anlattığım gibi, java da çoklu kalıtım yani “Multi Inheritance” yoktur. Bu sorunu ortadan kaldırmak için gömülü sınıfları kullanıyoruz. “Statik Gömülü Sınıf” hakkındaki bilgileri burada daha önceden vermiştim. Ortak konular olduğu için eğer okumadıysanız ilgili makaleyi buradan okuyabilirsiniz. Şimdi konumuza geçebiliriz.
Statik olmayan gömülü sınıflar aynı zamanda dahili sınıf (Inner Class) olarak da adlandırılırlar. Bu sınıflar 3’e ayrılırlar.
- Üye Dahili Sınıflar (Memmer Inner Class)
- Yerel DahiliSınıflar (Locale Inner Class)
- Anonim Dahili Sınıflar (Anonymous Inner Class)
Üye Dahili Sınıflar (Member Inner Class):
Üye Dahili Sınıflar, dış sınıfın statik olmayan üyelerinden olan dahili sınıflardır. Şimdi Üye Dahili Sınıflar hakkında bilgi edinmek için aşağıdaki kod bloklarını inceleyelim.
- Üye Dahili Sınıflar, sadece statik olmayan üyeler içermelidir. Statik üyelere, Üye Dahili Sınıflar içinde izin verilmez.
class DisSinif {
//Üye Dahili Sınıf : Bu sınıf statik olmayan bir üyedir.
class DahiliSinif {
int i; //Sadece statik olmayan üyeler içerebilir.
static int j = 10; //Burada statik üye tınımlanmaya çalışıldığı için derleme zamanı hatası oluşur.
//Statik üyeler kullanılamaz.
void metotBir() {
//Statik olmayan metot kullanılabilir.
}
static void metotIki() {
//Derleme zamanı hatası oluşur.
//Statik metot kullanılamaz.
}
}
}
Yukarıdaki kuralı verdikten sonra, tam da bu noktada ilgiç bir ayrıntıdan da bahsetmek gerekiyor. Üye Dahili Sınıflar içinde statik alan kullanılabilir. Ancak bu alan (field) final anahtar kelimesi ile kullanılmalıdır. Aksi halde yukarıdaki kural geçerlidir. Unutmayın, bu kural sadece alanlar (field) için geçerlidir. Metotlarda kullanılamaz.
class DisSinif {
class DahiliSinif {
int i; //Statik alan kullanılabilir.
static final int j = 10; //statik final alan kullanılabilir.
//Tanımlama esnasında değer atamasının yapılması gerekir.
}
}
Üye dahili sınıflar istenildiği kadar IIB bulundurabilir. (IIB ler hakkında bir makale yazmadığımı şimdi farkettim.) Ancak hiç SIB (Statik Initialization Block) bulunduramazlar.
class DisSinif {
class DahiliSinif {
int i;
{
System.out.println("İlk IIB");
}
{
System.out.println("İkinci IIB");
}
static {
//derleme zamanı hatası
//Üye Dahili Sınıflar SIB barındıramazlar.
}
}
}
Üye Dahili Sınıf içinden, dış sınıfa ait olan statik ve statik olmayan üyelere erişilebilir.
class DisSinif {
int i; //DisSinif'in statik olmayan alanı
static int j; //DisSinif'in statik alanı
void metotBir() {
System.out.println("DisSinif'in statik olmayan metodu");
}
static void metotIki() {
System.out.println("DisSinif'in statik metodu");
}
class DahiliSinif {
void dahiliSinifMetodu() {
System.out.println(i); //DisSinif'a ait statik olmayan alanlar kullanılabilir.
System.out.println(j); //DisSinif'a ait statik alanlar kullanılabilir.
metotBir(); //DisSinif'a ait statik olmatan metotlar çağrılabilir.
metotIki(); //DisSinif'a ait statik metotlar çağrılabilir.
}
}
}
Aşağıdaki örnek Üye Dahili Sınıfları ve bu üyelere nasıl erişilebileceğini göstermektedir.
class DisSinif {
class DahiliSinif {
int i; //DahiliSinif'da statik olmayan alan
static final int j = 10; //DahiliSinif'da static final olarak tanımlanmış alan.
void metotBir() {
System.out.println("DahiliSinif'a ait statik olmatan metot");
}
}
}
public class DahiliSiniflar {
public static void main(String args[]) {
DisSinif outer = new DisSinif(); //DisSinif örneği oluşturuluyor.
DisSinif.DahiliSinif dahili = outer.new DahiliSinif(); //DahiliSinif örneği oluşturuluyor.
System.out.println(dahili.i); //DahiliSinif'a ait statik olmayan alana erişim.
System.out.println(DisSinif.DahiliSinif.j); //Static alana direkt sınıf adı kullanılarak erişilebilir.
dahili.metotBir(); //DahiliSinif'a ait statik olmatan metot.
}
}
Dış sınıfın bütün üyeleri, Üye Dahili Sınıf içerisinden erişilebilir ve bütün Üye Dahili Sınıf üyeleri, görünürlükleri ne olursa olsun dış sınıf içinden erişilebilirler.
class DisSinif {
private int i; //DisSinif'a ait private alan.
int j; //DisSinif'a ait default erişim belirleyicili alan
protected int k; //DisSinif'a ait protected alan
public int m; //DisSinif'a ait public alan
void disSinifaAitMetot() {
DahiliSinif dahili = new DahiliSinif(); //DahiliSinif örneği oluşturuluyor.
System.out.println(dahili.a); //DahiliSinif içindeki private alana erişim
System.out.println(dahili.b); //DahiliSinif içindeki default alana erişim
System.out.println(dahili.c); //DahiliSinif içindeki protected alana erişim
System.out.println(dahili.d); //DahiliSinif içindeki public alana erişim
}
class DahiliSinif {
private int a; //DahiliSinif'a ait private alan
int b; //DahiliSinif'a ait default alan
protected int c; //DahiliSinif'a ait protected alan
public int d; //DahiliSinif'a ait public alan
void DahiliSinifMetodu() {
DisSinif dis = new DisSinif(); //DisSinif örneği oluşturuluyor.
System.out.println(dis.i); //DisSinif'a ait private alan erişimi
System.out.println(dis.j); //DisSinif'a ait default alan erişimi
System.out.println(dis.k); //DisSinif'a ait protected alan erişimi
System.out.println(dis.m); //DisSinif'a ait public alan erişimi
}
}
}
Üye Dahili Sınıflar abstract veya final olarak tanımlanabilirler. Ancak her ikisi birden olamazlar.
class DisSinif {
abstract class DahiliSinifBir {
//abstract Dahili Sınıf
}
final class DahiliSinifIki {
//final Dahili Sınıf
}
}
Bir sonraki makalemiz Yerel Dahili Sınıflar hakkında olacaktır. Görüşmek dileğiyle.
Tek Yorum
[…] arkadaşlar bir önceki yazımızda statik olmayan gömülü sınıflardan bahsetmiştik ve bu tür sınıfların 3’e […]