Rozdíl mezi statickou a nestatickou vnořenou třídou v Javě

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

Napsat komentář