There can be only one top level public class per source file and the name of that source file must match the name of the public class.
There can be any number of inner classes per top level class and you can make all of them public. We make an inner class public to be treated in the same way members of the class are treated like. BTW, when you need an instance of the inner class (that is non static) you must have reference to the outer class.
We can see the public inner class from outside the package also. Whereas with default access it can be seen inside the package (ofcourse with outer reference only in any case).