package com.learning.basic;

public class InnerClassLearning {
	public static String data = "static";
	public String instanceVariable = "instance";
	// Static inner Class
	private static class TestStaticInner {
		public static void validate() {
			System.out.println(" --  static inner class -- ");
			String innerData = data;
			System.out.println(" Static inner can access outer class static member");
			// String data = instanceVariable; // Not possbile
		}
	}

	// Instance inner class
	class TestInner {
		public void validate() {
			System.out.println(" --  instance inner class -- ");
			String innerData = data;
			System.out.println(" Instance inner can access outer class static member");
			String data = instanceVariable;  
			System.out.println(" Instance inner can access outer class instance member");
		}
	}

	// anonymous inner class
	public void validate() {
		Thread a = new Thread (new Runnable() {
			@Override
			public void run() {
				System.out.println(" --  Anonymous inner class -- ");
				System.out.println(" Anonymous inner class instance");
			}
		});
		a.start();
	}

	public static void main(String... strings) {
		InnerClassLearning.TestStaticInner.validate();
		
		InnerClassLearning outer = new InnerClassLearning();
		// Calling anonymous inner class
		outer.validate();
		// Syntax for creating the inner class instance
		InnerClassLearning.TestInner testInner = outer.new TestInner();
		testInner.validate();
		
	}
}