1~

Minter Coder's Blog

EK - Java nested ve inner sınıflar

2021-06-23

Bir classı diğer bir classın içinde tanımlamak mümkündür ; böyle classlar iç içe sınıflar olarak bilinir.Içteki classın scopu onu kapsayan diğer sınıf ile sınırlıdır.Böylece , eğer B classı A sınıfının içinde tanımlnmışsa , o zaman B sınıfı A sınıfından bağımsız var olamaz.Içteki class onu kapsayan classın private memberleri de dahil tüm memberların erişimine sahiptir.Ancak enclose eden sınıfın içteki sınıfın üyelerine erişimi yoktur.

 

Iki tür iç içe sınıf vardır : static ve non-static.Bir static içe içe classı static erişim belirtecine sahip olan classtır.Static olduğu için onu kapsayan , çevreleyen classın üyelerine bir object vasıtasıyla erişmek zorundadır.Çünkü , static olduğundan ötürü onu çevreleyen classın static olmayan üyelerine directly erişemez.Bu kısıtlama yüzünden,static iç içe classlar nadiren kullanılır.

En önemli iç içe sınıf inner classtır.Bir inner class non-static iç içe classıdır.Inner class onu çevreleyen classın tüm değişkenlerine ve metodlarına directly olarak erişebilir.

Aşadağıda örnek verildir.Outer isimli class bir örnek değişkene sahip adı outer_x , bir methoda sahip test() adlı ve bir iç classa da sahip adı Inner.

 

class Outer{
    int outer_x = 100;
    void test() {
        Inner inner = new Inner();
        inner.display();
    }
<span style="color:#cc7832">class </span>Inner{
    <span style="color:#cc7832">int </span><span style="color:#9876aa">x </span>= <span style="color:#6897bb">3</span><span style="color:#cc7832">;

void display() { System.out.println("Display : outer_x = "+outer_x); } } }

class InnerClassDemo{ public static void main(String[] args) { Outer outer = new Outer(); outer.test(); } }

 

Bu uygulamanın çıktısı :

display: outer_x = 100

 

Programda , Inner isimli Outer classının scopu içerisinde tanımlanmış bir inner class var .Bu yüzden , herhangi bir cod Inner class içerisindeki , directly olarak outer_x değişkenine erilebilir.Örnek bir method olan display() Inner classı içerisinde tanımlandı.Bu method outer_x değişkenini gösteriyor.InnerClassDemo sınıfının main methodu ise Outer classın bir instancesini yaratıyor ve onun test methodunu çağırıyor.Bu method da Inner classının bir instancesini oluşturuyor ve display() methodunu çağırıyor.

 

Burada dikkat etmemiz gereken önemli bir nokta var o da Inner classının bir öneği sadece Outer classın içerisinde yaratılabilir.Diğer durumda Java compiler hata üretecek.Genelde, bir inner class instacesi onu çevreleyen,kapsayan scopda oluşturulur.Aşağıdaki örneğe bakalım;

 

class Outer{
    int outer_x = 100;
    void test() {
        Inner inner = new Inner();
        inner.display();
    }
<span style="color:#cc7832">class </span>Inner{
    <span style="color:#cc7832">int </span><span style="color:#9876aa">x </span>= <span style="color:#6897bb">3</span><span style="color:#cc7832">;

int y = 15; // y burada!!!! void display() { System.out.println("Display : outer_x = "+outer_x); } }

<span style="color:#cc7832">void </span><span style="color:#ffc66d">showY</span>(){
    System.<em>out</em>.println(y)<span style="color:#cc7832">; </span><span style="color:#808080">// hata, y buradan bilinmiyor

} }

class InnerClassDemo{ public static void main(String[] args) { Outer outer = new Outer(); outer.test(); } }

 

Burada y Inner classının bir örnek variablesı olarak tanımlandı.Böylece , bu değişken Inner classı dışındaki classlarda bilinmez ve showY methodu içerisinde de kullanılamaz.