I was reading Effective Java 2 - Item 22 and it says in the title:
"Favor static member classes over non-static"
but at the end of the chapter
Implementations of the collection interfaces, such as Set and List, typically use nonstatic member classes to implement their iterators:
// Typical use of a nonstatic member class
public class MySet<E> extends AbstractSet<E> {
    ... // Bulk of the class omitted
    public Iterator<E> iterator() {
        return new MyIterator();
    }
    private class MyIterator implements Iterator<E> {
        ...
    }
}
I made a test program to see if there is any difference between them and here it is.
public class JavaApplication7 {
    public static void main(String[] args) {
        // TODO code application logic here
        JavaApplication7 t = new JavaApplication7();
        Inner nonStaticObject = t.getAClass();
        Sinner staticObject = new JavaApplication7.Sinner();
        nonStaticObject.testIt();
        staticObject.testIt();         
    }
    public Inner getAClass(){
        return new Inner();
    }
    static class Sinner{
        public void testIt(){
            System.out.println("I am inner");
        }
    }
    class Inner{
        public void testIt(){
            System.out.println("I am inner");
        }
    }
}
The output is
I am inner I am inner
So, they did the same job.
I wonder Why non-static class is used in this example?
 
     
     
     
     
     
    