Vnořená třída, která není statická, má přístup ke všem proměnným a metodám (i private) nadřazené třídy. Tato vnořená třída ale nelze vytvořit bez instance nadřazené (zaobalující) třídy.
Třída s vnořenou nestatickou třídou
public class ClassWithInner { private String message; public InnerClass getInnerClass() { return new InnerClass(); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public class InnerClass { private int number; public void getMessage() { System.out.println(message); setMessage("new message"); System.out.println(ClassWithInner.this.getMessage()); } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } } }
Vytvoření v main metodě
public static void main(String[] args) { // nelze, neexistuje instance ClassWithInner // ClassWithInner.InnerClass innerClass = new ClassWithInner.InnerClass(); ClassWithInner classWithInner = new ClassWithInner(); InnerClass innerClass = classWithInner.getInnerClass(); innerClass.printMessage(); }
Vnořená statická třída nepotřebuje k vytvoření instanci zaobalující třídy. Na rozdíl od nestatické, ale nemá přístup k proměnným obalující třídy.
Třída s vnořenou statickou třídou
public class ClassWithInnerStatic { private String message; public InnerStaticClass getInnerStaticClass() { return new InnerStaticClass(); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public static class InnerStaticClass { int number; public void printMessage() { // nelze: Cannot make a static reference to the non-static method getMessage() from the type ClassWithInnerStatic // System.out.println(getMessage()); } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } } }
Vytvoření v main metodě
public static void main(String[] args) { // třída lze vytvoři i bez instance ClassWithInnerStatic ClassWithInnerStatic.InnerStaticClass innerStaticClass = new ClassWithInnerStatic.InnerStaticClass(); innerStaticClass.setNumber(123); System.out.println(innerStaticClass.getNumber()); }