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());
}

