İç Sınıflar ve Anonim Sınıflar   
Her bileşen (her tür olay) için ayrı bir sınıf yaratmak çok kullanışsız olabilir. Bunun yerine Java nın bir sınıf içinde başka bir sınıf (ve onun örneklerini) bildirebilme özelliği kullanılabilir. Bu tür sınıflar başka sınıfları genişletiyor ve/veya bazı arayüzleri geçekleştiriyor olabilirler. İç sınfın her örneği onu kapsayan nesneyle bir bağa sahiptir. Bu yüzden onu kapsayan nesnesin üyelerine erişebilir.
Bir iç sınıf başka bir sınıfın içine konarak şu şekilde bildirilebilir:
public class MyClass {
	class Inner1 {
		public void doX(){
			...
		}
	}

	public void doY(){
		Inner1 i1 = new Inner1();
		...
		class Inner2{
			public void doZ(){
				...
			}
		};
		Inner2 i2 = new Inner2();
		...
	}
}
						
Ayrıca bir yöntemin içinde isimsiz bir sınıf bildirmek ve onun örneğini yaratmak da mümkündür. Bu sınfılar anonim sınıflar olarak adlandırılırlar. Örneğin, aşağıdaki ClassX'in doX() yöntemi ClassY'i genişleten (veya ClassY arayüzünü gerçekleştiren) anonim sınıfın bir örneğini yaratır.
class ClassX{
	...
	public void doX(){
		...
		ClassY y = new ClassY(){
			// yeni yöntemler/öznitelikler tanımla
			// veya bazı yöntemleri gerçekleştir yada üstüne yaz
			public void doZ(){
				...
			}
			...
		};
		...
	}
}