16 Nisan 2019 Salı

Inner/Nested Class

Giriş
Java bir sınıf içinde başka bir sınıf tanımlamaya izin verir. Bu iç sınıf 3 farkı şey olabilir. 
1. Static Nested Sınıf
2. Non-Statıc Nested Sınıf

Not : Bu yazıda Nested veya Inner kelimeleri aynı şeyi ifade ediyor.

Nested Sınıf vs Anonymous Sınıf
Inner/Nested Sınıf ile Anonymous Sınıf kavramsal olarak farklı şeylerdir.

Nested Sınıf  Nedir?
Açıklaması şöyle. Nested ve Inner sınıflar kendilerini sarmalayan sınıflara erişebilir.
Terminology: Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes.
import
Açıklaması şöyle.
Note: Another, less common form of import allows you to import the public nested classes of an enclosing class. For example, if the graphics.Rectangle class contained useful nested classes, such as Rectangle.DoubleWide and Rectangle.Square, you could import Rectangle and its nested classes by using the following two statements.
import graphics.Rectangle;
import graphics.Rectangle.*;
Be aware that the second import statement will not import Rectangle.
Yani import java.lang.Math.* yaparsak Math sınıfı içindeki inner sınıfları import ederiz ancak Math sınıfını dahil etmeyiz.


1. static Nested Class
Açıklaması şöyle.
A static member class is the simplest kind of nested class. It is best thought of as an ordinary class that happens to be declared inside another class and has access to all of the enclosing class’s members, even those declared private.
Örnek
Nested class'ın private metodları dış sınıf tarafından kullanılabilir. Şöyle yaparız.
public class Foo{
  public static class Inner {
    private void doIt() {
      System.out.println("doIt()");
    }
  }
  public static void main(String[] args) {
    Foo.Inner i = new Inner();
    i.doIt();
  }
}
Örnek
Nested class dış sınıfın private metodunu kullanabilir. Şöyle yaparız.
public class OuterClass {

  private void printMessage(String message) {
    System.out.println(message);
  }

  private static class InnerClass {

    private void sayHello(OuterClass outer) {
      outer.printMessage("Hello world!"); // allowed
    }

  }
}
Örnek
Tabiki nested class'ın metodu static ise dış sınıfın metodu da static olmalı. Şu kod derlenmez.
public class OuterClass {

  public void printMessage(String message) {
    System.out.println(message);
  }

  private static class InnerClass {

    public void sayHello() {
      printMessage("Hello world!"); //error: Cannot make a static reference to the
                                    //non-static method printMessage(String)
    }

  }
}
2. non-static Inner Class
Static Olmayan Inner/Nested Class yazısına taşıdım

3. Local Class
Local Class ile Inner/Nested Class farklı şeyler. Local class metod içine tanımlanır.
Örnek
Şöyle yaparız
public class X {
  void m() {
    class Z {}
    ...
}

Hiç yorum yok:

Yorum Gönder