Inner class is declared inside another class
And "inside" here means "between curlies", not "in the same source file". It has some priviliges accessing its owner's internals. Unless the inner class is delcred "static", it can only be instantiated inside its owner's non-static member function. And it retains a pointer to the owner's instance after instantiation, so you can call owner's members (you can do it w/o any special syntax, just treat owner's member functions as if they are your own).
This come in handy for things like callbacks, iterators, event handlers.
A version of inner class is "anonymous" class, where you create an instance and define the class at the same time. You can do things like this:
\nsomething.addListener(new SomethingListener() {\n public void eventHappened(SomethingEvent event) {\n processSomethingEvent(event);\n }\n}\n
"processSomethingEvent()" here is an owner's method.