16 Nisan 2015 Perşembe

Java ve nested classlar

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Java'da nested classlar ikiye ayrılır: static ve non-static.
non-static nested classlara inner class da denir.

1. Static nested class

Bir nested classı başında static keywordu ile yazarsak bu bir static nested class olur.
Static nested classlara önce dıştaki classın adı yazılarak erişilebilir.
Örneğin Library classı içerisinde static nested class olarak tanımlanmış bir Book classını kullanabilmek için:

Library.Book book = new Library.Book();
book.setName("bookname");
System.out.println(book);

2. non-static nested class / inner class

Static olmadan bir class içinde tanımlanmış nested classlardır.
Bu classların instance'ları sadece dıştaki classın bir instance'ı içerisinde yaratılabilirler.

Örneğin static olmayan bir nested class yani bir inner class olarak Book classını yazdığımızda, yeni bir Book instance'ı yaratmak için önce dıştaki class olan Library'den bir instance almamız gerekir.
Ondan sonra bu nesnenin new operatörünü kullanarak yeni bir Book nesnesi yaratabiliriz.

Library lib = new Library();
Book book = lib.new Book();
book.setName("bookname");
System.out.println(book);


Inner classların iki özel durumu vardır: local ve anonymous class'lar.

a. Local class:

Local class bir blok içerisinde tanımlanır. Yani bir metod, if ya da for döngüsü gibi.
Local class içinde static member bulunduramaz.
Local class dıştaki classın memberlarına erişebilir.

b. Anonymous class:

Bir interface'i implement ederek nested olarak yazılan, genelde tek seferlik tanımlanıp hemen orada kullanılması istenen classlardır.
Örneğin bir thread yaratmak için Runnable interface'ini implement ederek bir anonim class yazabiliriz. Bu classın run metodunu çağırarak da bağımsız bir class gibi kullanabiliriz.

Runnable runnable = new Runnable() {

            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        System.out.println("Hello!");
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        //ex
                    }
                }
            }
};
runnable.run();

1 yorum: