Well thangaraj this is because non-static inner class is always associated with an enclosing class instance. So practically it's members should be inaccessible to any code directly without creating an instance of enclosing class. but if non-static inner class is allowed to have static members, then you can do this
but in case of static constants, the constant value is replaced by the compiler with the actual value of the constant
the System.out.println(Outer.Inner.i); will become System.out.println(10);
I think this is the reason, let's see what others have to say...