Paylaşım , Takip İçin
Dahili Sınıf Nedir?
- Java dilinde, diğer dillerde bulunan çoklu kalıtım özelliği yoktur.
- Bu çoklu kalıtım özelliğini desteklemek amacıyla dahili sınıflar kullanılır.
- Java çoklu kalıtımı Arayüz(Interface) ve dahili sınıflar(inner classes) ile sağlar.
- Dahili Sınıflar sınıf içerisinde tanımlanmış sınıflar olarak düşünülebilir.
- Dahili sınıflar 3’e ayrılabilir.
- Dahili Üye Sınıflar
- Yerel Sınıflar
- İsimsiz Sınıflar
Dahili Üye Sınıflar
- Dahili Üye sınıflar, bir sınıf içerisinde tanımlanmış sınıflardır.
- Erişim belirleyiciler kullanılarak, dahili sınıfları üst sınıfımız içerisindeki diğer dahili sınıflara karşı kısıtlayabiliriz.
- Fakat dahili sınıfımızın erişim belirleyicisi ne olursa olsun üst sınıf metotları dahili sınıfımıza ait tüm üye değişken ve metotlara erişebilirler.
Örnek
public class InnerClasses {
//Asal Sayıları bulan inner class
public class Asal{
public boolean asalSayi(int sayi) {
int num=0;
boolean check=false;
if(sayi>1) {
for (int i=2;i<sayi;i++) {
if (sayi%i==0) {
num++;
}
}
if(num==0)
check=true;
else
check=false;
}
return check;
}
}//inner class sonu
protected class PerfectNumber{
protected boolean isPerfect(int num) {
int sum=0;
boolean check;
for (int i=1;i<num;i++) {
if(num%i==0)
sum+=i;
}
if(num==sum)
check=true;
else
check=false;
return check;
}
}
}
public class test {
public static void main(String[] args) {
//Dahili Sınıftan nesne yaratılması
InnerClasses.Asal asal=new InnerClasses().new Asal();
boolean sonuc=asal.asalSayi(101);
System.out.println(sonuc);
InnerClasses.PerfectNumber perfect=new InnerClasses().new PerfectNumber();
System.out.println(perfect.isPerfect(8128));
}
}
Statik Dahili Üye Sınıflar
- Eğer dahili üye sınıfımızı static olarak tanımlarsak dahili sınıfın elemanlarına doğrudan o sınıfın adı kullanılarak erişilebilir.
- (nesne yaratmaya gerek kalmaz.)
- Statik dahili üye sınıflar, kendilerini çevreleyen sınıfa ait bağlantıyı (this) kaybederler.
- Yani nesne yaratamazsınız.
Örnek
public class calculate {
public class Bolme{
public double bol(double a,double b) {
return a/b;
}
}
public static class Toplama{
public static int topla(int a,int b) {
return a+b;
}
}
public static void main(String[] args) {
double sonuc;
calculate.Bolme obj=new calculate().new Bolme();
sonuc=obj.bol(12, 5);
System.out.println(sonuc);
sonuc=Toplama.topla(12, 9);//Nesnesiz erişim
System.out.println((int)sonuc);
}
}
Soyut Dahili Üye Sınıflar (Abstract Inner Classes)
- Dâhili üye sınıflar, soyut (abstract) sınıf olarak tanımlanabilir.
- Bu soyut dâhili üye sınıflardan türeyen sınıflar, soyut dâhili üye sınıfların içerisindeki gövdesiz (soyut) metotları override etmeleri gerekmektedir.
- Dahili üye sınıflara ait diğer özellikler Soyut Dahili Üye Sınıflar içinde geçerlidir.
Örnek
class Hayvan{
abstract class Kus{
public abstract void uc();
public abstract void kon();
}
}
//burada kus sınıfına ait soyut sınıf
//kullanılacaksa once bu sınıfı cevreleyen
//hayvan sınıfına ait bir nesne bulunması zorunludur
class Kartal extends Hayvan.Kus{
public Kartal(Hayvan hv) {
//Hayvan sınıfına ait nesnenin yapılandırıcısı
hv.super();
}
public void uc() {
System.out.println("Kartal uçuyor");
}
public void kon() {
System.out.println("Kartal kondu");
}
}
public class AbstractInnerClass {
public static void main(String args[]) {
Hayvan hv=new Hayvan(); //Gerekli nesne
Kartal krt=new Kartal(hv);
krt.uc();
krt.kon();
}
}
-------------------------------
Kartal uçuyor
Kartal kondu
Yerel Sınıflar
- Yerel Sınıflar metot içerisinde tanımlanan sınıflardır.
- Dahili üye sınıfların kendilerini çevreleyen üst sınıfları olduğunu anlattık.
- Yerel sınıflarda ise kendilerini çevreleyen metotlar vardır.
- Sadece bu metot içerisinde erişilebilen sınıflardır.
- Yerel sınıflar başka sınıflardan türetilebilir veya arayüzlere (interface) erişebilir.
- Yerel sınıflar, erişim belirleyiciye sahip olamazlar.
- Yerel sınıflar sadece friendly erişim belirteciyle işaretleriz.
- Yerel sınıfların bir constructor’ı olabilir.
- Yerel sınıflar, statik olarak tanımlanamaz.
Örnek
interface function{
public double kareAl(double sayi);
}
public class LocalClass {
public double square(double num) {
//Yerel Sınıf Tanımı
class kareAlma implements function{
@Override
public double kareAl(double sayi) {
return sayi*sayi;
}
}
kareAlma obj=new kareAlma();
return obj.kareAl(num);
}
public static void main(String[] args) {
LocalClass lc=new LocalClass();
System.out.println(lc.square(12));
}
}
İsimsiz Sınıflar
- İsimsiz sınıflar, isim kullanılmadan tanımlanana sınıflardır.
- İsimsiz sınıflar başka bir sınıftan türetilmez ve başka bir arayüzü implement edemezler.
- Ayrıca isme sahip olmadıkları için yapılandırıcı metotları (constructor) yoktur.
- İsimsiz metotlar yer aldıkları metotların sadece final olarak tanımlanan değişkenlerine erişebilirler.
- İsimsiz sınıflar havada oluşturulabildiklerinden dolayı birçok işlem için çok avantajlıdır, özellikle olay dinleyicilerin (event listeners) devreye sokulduğu uygulamalarda sıkça kullanılırlar.
Örnek
interface Toplayici {
public int hesaplamaYap();
}
public class Isimsiz {
public Toplayici topla(final int a, final int b) {
return new Toplayici() {
public int hesaplamaYap() {
// final olan yerel degiskenlere ulasabilir.
return a + b ;
}
}; // noktali virgul sart
} // topla, metot sonu
public static void main(String args[]) {
Isimsiz Isz = new Isimsiz();
Toplayici t = Isz.topla(5,9);
int sonuc = t.hesaplamaYap();
System.out.println("Sonuc = 5 + 9 = " + sonuc );
}
} // class Isimsiz
Paylaşım , Takip İçin