Bu makalede, java’da çok sık kullanmadığımız. Ancak ihtiyacımız olacak bir konudan bahsedeceğim. Gömülü sınıflar. Bu konuyu sözel olarak anlatmak biraz zor olacağı için, makale içinde bol bol kod örnekleri bulabileceksiniz.
Gömülü sınıftan kasıt, sınıf içinde başka bir sınıfın tanımlanmasıdır. Bildiğimiz gibi bir sınıfın birden çok çeşit üyesi olabilir. Bunlara örnek olarak metotlar ve field’lar verilebilir. Tıpkı bunlar gibi bir başka üyesi daha vardır. class’lar… Bir sınıfın başka bir sınıf üyesi olabilir. Örneğin:
class DisSinif {
int i; //Field bir üyedir
void metotBir() {
//metot bir üyedir.
}
class GomuluSinif {
//class bir üyedir
}
}
2 çeşit gömülü sınıf vardır.
- Statik gömülü sınıflar
- Statik olmayan gömülü sınıflar veya iç sınıflar.
Bu bakalemizde sadece statik gömülü sınıflar hakkında konuşacağız.
Java’da Static Gömülü Sınıflar:
Bir gömülü class statik olarak tanımlanırsa, buna static gömülü sınıf adı verilir.
class DisSinif {
int i; //Field bir üyedir
void metotBir() {
//metot bir üyedir.
}
static class GomuluSinif {
//static nested sinif
}
}
Bu kısa bilgilerden sonra statik gömülü sınıflar hakkında bazı ilginç noktalara değinelim.
Statik gömülü sınıflar, hem statik hem de statik olmayan üyeler içerebilir.
class DisSinif {
//DisSinif'a ait üyeler aşağıdakilerdir
static class GomuluSinif {
static int i; //Statik alan
int j; //Statik olmayan alan
void metotBir() {
//Statik olmayan metot
}
static void metotIki() {
//Statik metot
}
}
}
Statik gömülü sınıflar içerisinden dış sınıfın yalnızca statik üyelerine erişilebilir. Dış sınıfın statik olmayan üyelerine erişilemez.
class DisSinif {
static int i; //DisSinif'a ait statik alan
int j; //DisSinif'a ait statik olmayan alan
void metotBir() {
//DisSinif'a ait statik olmayan metot.
}
static void metotIki() {
//isSinif'a ait statik metot.
}
static class GomuluSinif {
void icSinifMetodu() {
System.out.println(i); //static ala erişilebilir.
System.out.println(j); //Statik olmayan alana erişilemez. Derleme zamanı hatası alınır.
metotIki(); //statik metoda erişilebirç
metotBir(); //Statik olmayan metoda erişilemez. Derleme zamanı hatası alınır
}
}
}
Statik metotlar abstract olarak tanımlanamazlar. Fakat static olarak tanımlanmış gömülü classlar abstract olarak tanımlanabilirler.
class DisSinif {
//static ve abstract iç sınıf
abstract static class GomuluSinif {
abstract void metotBir(); //GomuluSinif'a ait abstract metot
void metotIki() {
//GomuluSinif'a ait metot.
}
}
}
Statik gömülü ssınıflar final olarak tanımlanabilir.
class DisSinif {
//final ve static olarak tanımlanmış gömülü sınıf
final static class GomuluSinif {
void metotBir() {
//GomuluSini'a ait somut sinif.
}
}
}
Aşağıdaki örnek, statik gömülü sınıflarda nesne referanslarının nasıl gerçekleştirildiği görülebilir.
class DisSinif {
int i = 10; //Non-static Field of OuterClass
static void metotBir() {
System.out.println("DisSinif'a ait statik metot");
}
static class GomuluSinifBir {
int i = 20; //Non-static Field of NestedClassOne
static void metotBir() {
System.out.println("GomuluSinifBir'e ait statik metot");
}
}
static class GomuluSinifIki {
int i = 30; //GomuluSinifIki'ye ait statik olmayan değişken.
static void metotBir() {
System.out.println("GomuluSinifIkiye'ye ait statik metot");
}
}
}
public class GomuluSiniflar {
public static void main(String[] args) {
DisSinif.metotBir(); //static üyeye direkt sınıf adı kullanılarak erişilebilir.
DisSinif disSinif = new DisSinif();
System.out.println(disSinif.i); //statik olmayan üyeye sınıf örneği ile erişilebilir.
DisSinif.GomuluSinifBir.metotBir(); //static üyeye direkt sınıf adı kullanılarak erişilebilir.
DisSinif.GomuluSinifBir gomuluBir = new DisSinif.GomuluSinifBir();
System.out.println(gomuluBir.i); //statik olmayan üyeye sınıf örneği ile erişilebilir.
DisSinif.GomuluSinifIki.metotBir(); //static üyeye direkt sınıf adı kullanılarak erişilebilir.
DisSinif.GomuluSinifIki gomuluIki = new DisSinif.GomuluSinifIki();
System.out.println(gomuluIki.i); //statik olmayan üyeye sınıf örneği ile erişilebilir.
}
}
Gömülü sınıflara ait constructor’lar ve metotlar aşırı yüklenebilir (overloading)
class DisSinif {
static class GomuluSinif {
GomuluSinif() {
//İlk constructor
}
GomuluSinif(int i) {
//İkinci Constructor
}
GomuluSinif(int i, int j) {
//Üçüncü Constructor
}
void metotBir() {
//Aşırı Yüklenmiş (Overloaded) metot
}
void metotBir(int i) {
//Aşırı Yüklenmiş (Overloaded) metot
}
void metotBir(int i, int j) {
//Aşırı Yüklenmiş (Overloaded) metot
}
}
}
Gömülü sınıflar zincirleme şeklinde tanımlanabilir. Yani bir gömülü sınıf içinde, başka bir gömülü sınıf, onun içinde de başka bir gömülü sınıf tanımlanabilir.
lass DisSinif {
static class GomuluSinif {
static class GomuluSinifBir {
static class GomuluSinifIki {
static class GomuluSinifUc {
static void metotBir() {
System.out.println("Gömülü sınıflar zinciri");
}
}
}
}
}
}
public class NestedClasses {
public static void main(String[] args) {
DisSinif.GomuluSinif.GomuluSinifBir.GomuluSinifIki.GomuluSinifUc.metotBir();
}
}
Umarım faydalı bilgiler aktara bilmişimdir. Sormak istediğiniz konularla alakalı olarak benimle iletişime geçebilirsiniz.
İlk Yorumu Siz Yapın