import static java.lang.System.out; class Outer { static class InnerStatic { // static inner class // cannot access outer instance int i = 0; } class Inner { // inner class // can access outer instance int i = Outer.this.o; } int o = -1; } class Base { public void Hello() { out.println("Hello, world!"); } } class Hello { int h = 100; public void hello() { final int i = 100; Base b = new Base() { // Create an anonymous inner class that extends Base public void Hello() { out.println("Thank you!"); out.println("The value of the instance of outer Hello is: " + Hello.this.h); out.println("The outer value is: " + i); // variable i must be final } }; b.Hello(); } } public class Test { public static void main(String[] args) { Outer.InnerStatic in1 = new Outer.InnerStatic(); in1.i = 10; out.println("The value1 is: " + in1.i); Outer outer = new Outer(); Outer.Inner in2 = outer.new Inner(); out.println("The outer value is: " + in2.i); in2.i = 100; out.println("The value2 is: " + in2.i); Outer.InnerStatic in11 = new Outer.InnerStatic(); out.println("The value11 is: " + in11.i); Hello h = new Hello(); h.hello(); h.h = -100; h.hello(); } }