The public classes in a package are intended to be used by classes in other packages. The non-public classes are not. Similarly, public nested classes are intended for use by code in other packages, while private nested classes are intended to be used only by the containing class. The "used by code in other packages" stuff might be slightly confusing; if you're used to thinking of student programs that consist of only one class, it's meaningless. But "real" software often contains thousands of classes; structuring them into packages makes the program comprehensible, and hiding most of the classes as non-public classes makes the relationships between the packages much clearer.