Here you are instantiating an InnerDemo object which has access to the non-static inner class of MyThread.
This will also work in the previous example if you instantiate a First object and call the non-static Second class method with that object.
By creating the object of the outer class, you bypass the compiler's objection. You are no longer referencing a non-static variable from a static context. You are referencing a non-static variable from a non-static (instance) context.
JavaBeginnersFaq "Yesterday is history, tomorrow is a mystery, and today is a gift; that's why they call it the present." Eleanor Roosevelt
I think you may be over-thinking inner classes Paul. Your example just shows the same type of behavior as main above. You create an object, this objet has methods and fields, and you can invoke those methods and access those fields that are accessible. An inner class in just a member class of an object, so you can access it as you would a method or field.
Variables and classed declared local to a method aren't available to the outside world. You can never access your local class declaration from anywhere but that local method. So that should help narrow down your confusion. Rob