27 Ocak 2015 Salı

Inner Classes-2

       S.a. Arkadaşlar,
      Bugünkü konumuz yine dahili sınıflar olacak. Birinci yazıda dahili ve interface dahili sınıfları işlemiştik. Bu yazımızda ise anonymous ve static dahili sınıfları işlemeyi düşünüyoruz. Böylece dahili sınıfları bitireceğiz. Şimdi devam kaldığımız yerden. Öncelikle anonymous dahili sınıfına başlayalım. Adından da anlayacağımız gibi belirsiz ya da adı olmayan sınıf olarak da nitelendirebiliriz. Peki bu ne demektir , isimsiz sınıf mı olur dediğini duyar gibiyim, burada isim olmasından kasıt direkt bir ad yazmak yerine , obje ile birlikte kullanılmasından kaynaklanıyor. Kod tarafına geçeceğimiz zaman yorum satırlarıyla destekleyip ne demek istediğimizi umarım daha iyi anlayacaksınız.

class Keyboard {//extends Computer, run time error
public void write() {
System.out.println("Keyboard Write");
}
        public void anotherWrite(){
               System.out.println("kEYBOARD wRITE");
        }
}
interface  Mouse { //diğer dahil sınıflardaki gibi interface
       public void move();
       public final static int sensivity=5;
       int speed=5; //yukarıdaki tanımlama ile aşağıda aynıydı hatırlarsanız
}

abstract  class Printer{ // ve soyut sınıf tanımlanabilir
        public abstract void scan();
     
}

public class Computer {

Keyboard keyboard = new Keyboard() {
@Override
public  void write() {
System.out.println("Anonymous Write");
}
                public  void bigWrite(){
                        System.out.println("ANANYMOUS WRITE");
                }
}; // noktali virgulu unutmayalim!

Keyboard keyboard2 = new Keyboard();

public static void main(String[] args) {
Computer com = new Computer();
com.keyboard.write();
com.keyboard2.write();
                //com.keyboard.bigWrite();
                com.keyboard.anotherWrite();
                com.keyboard2.anotherWrite();
             
                Mouse mouse = new Mouse() {
@Override
public void move() {
System.out.println("Anonymous Move");
}
};//noktalı virgüllere dikkat
                mouse.move();
             
                String localVariable="local";
                final String localFinal="local Final";
                Printer printer = new Printer (){
                   // static String staticVariable = "compile error"; error
                    static final String staticVariable = "run";
                    //static final void metod();
                    //metod her haliyle hata verir hatırlarsanız
                    @Override
                    public void scan(){
                            System.out.println("Anonymous Scan");
                            //System.out.println(localVariable);
                            //final olursa dışarıdaki local değişkene erişebilir
                            System.out.println(localFinal);
                         
                    }
                };//noktalı virgüller dikkat
                printer.scan();    
         }

}

      Yorum satırlarıyla elimiz geldiğince gerekli yerlerde konuyu anlatmaya çalıştık ama karışık gelmiş olabilir bazı şeyler , belki de yeterince sade anlatamamış olabiliriz. Anlamadığımız yerler olduğu zaman sormakta çekinmeyin. Birlikte öğrenmeye gayret ederiz. Şimdi de static dahili sınıflara geçelim. Static dahili sınıf aslında tam olarak dahili sınıf olarak da tanımlanmayabilir. Bu ne demek şimdi diye sorduğunuzu duyar gibiyim. Şöyle anlatalım. Bir sınıf içerisinde sıradan bir metod çağırdığımızda ne yapmamız gerekiyordu. Öncelikle bir nesne oluşturup Sinif sinif= new Sinif(); sinif.metod(); demememiz gerekliydi bildiğiniz gibi fakat bu metod static olduğunda ne yapıyorduk her hangi bir obje oluşturmadan da metodu çağırabiliyorduk. Bu static dahili sınıf da öyle , dışarıdaki sınıfa ihtiyaç olmadan değişken ve metodlara ulaşılabilir. Kod kısmına geçip örneklendirdiğimiz zaman daha iyi anlayacağınızı düşünüyoruz.

public class Outer {

static class StaticNested {
                private String instanceVariable = "I am instance variable";
private static String staticVariable = "i am static variable";
void method() {
System.out.println("StaticNested method");
                        System.out.println(instanceVariable);
                        System.out.println(staticVariable);
}

static void staticMethod() {
System.out.println("StaticNested static method");
                        //System.out.println(instanceVariable);
                        //beklenen yine oldu ve staticte static olmayan çalışmaz
                        //staticleri asil olarak düşünün, ve asiller kendi aralarına
                        //diğer tabakadakileri almıyorlar ...
                        //ama diğer tabakalardaki insanların olduğu yere
                        //asiller girebiliyor. Umarım iyi bir örnek olmuştur
                        System.out.println(staticVariable);
}
}

class InnerClass {
void method() {
System.out.println("InnerClass method");
}

                //static void staticMethod() {
                //System.out.println("compile error");
                //}
                //static olmayan sınıf içinde static metod tanımlanmaz
}

public static void main(String[] args) {

                Outer.InnerClass innerClass = new Outer().new InnerClass();
InnerClass innerClass2 = new Outer().new InnerClass();
                //yukarıdaki static olmayan dahili sınıf tanımlaması
                //aşağıdaki ise static sınıf tanımlaması
                //aradaki farka dikkat edin lütfen

StaticNested staticNested = new StaticNested();
                staticNested.method();
                //Static.method desek hata çünkü metod static değildir!!
                StaticNested.staticMethod();
                //baş harfe dikkat, küçük harf yaptığımız zaman warning veriyor
                //diyor ki obje tanımlamanıza gerek yoktur direk çağırabilirsiniz
                //bunu söylemesinin sebebi static oluşudur
}

}

    Static dahili sınıflarla birlikte hem yazımızı hem de dahili sınıfları geride bıraktık. Umarız en iyi şekilde verim alabilirsiniz. Çalışmalarınıza başarılar dileriz. Kolay gelsin




Hiç yorum yok:

Yorum Gönder