Klasy wewnętrzne Java


Klasy wewnętrzne Java

W Javie możliwe jest również zagnieżdżanie klas (klasa w klasie). Celem klas zagnieżdżonych jest grupowanie klas, które należą do siebie, dzięki czemu kod jest bardziej czytelny i łatwiejszy w utrzymaniu.

Aby uzyskać dostęp do klasy wewnętrznej, utwórz obiekt klasy zewnętrznej, a następnie utwórz obiekt klasy wewnętrznej:

Przykład

class OuterClass {
  int x = 10;

  class InnerClass {
    int y = 5;
  }
}

public class Main {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}

// Outputs 15 (5 + 10)


Prywatna klasa wewnętrzna

W przeciwieństwie do „zwykłej” klasy, klasą wewnętrzną może być privatelub protected. Jeśli nie chcesz, aby zewnętrzne obiekty miały dostęp do klasy wewnętrznej, zadeklaruj klasę jako private:

Przykład

class OuterClass {
  int x = 10;

  private class InnerClass {
    int y = 5;
  }
}

public class Main {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}

Jeśli spróbujesz uzyskać dostęp do prywatnej klasy wewnętrznej z klasy zewnętrznej, wystąpi błąd:

Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
              ^



Statyczna klasa wewnętrzna

Klasą wewnętrzną może być również static, co oznacza, że ​​można uzyskać do niej dostęp bez tworzenia obiektu klasy zewnętrznej:

Przykład

class OuterClass {
  int x = 10;

  static class InnerClass {
    int y = 5;
  }
}

public class Main {
  public static void main(String[] args) {
    OuterClass.InnerClass myInner = new OuterClass.InnerClass();
    System.out.println(myInner.y);
  }
}

// Outputs 5

Uwaga: podobnie jak staticatrybuty i metody, staticklasa wewnętrzna nie ma dostępu do członków klasy zewnętrznej.


Uzyskaj dostęp do klasy zewnętrznej z klasy wewnętrznej

Jedną z zalet klas wewnętrznych jest to, że mają dostęp do atrybutów i metod klasy zewnętrznej:

Przykład

class OuterClass {
  int x = 10;

  class InnerClass {
    public int myInnerMethod() {
      return x;
    }
  }
}

public class Main {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.myInnerMethod());
  }
}

// Outputs 10