2
votes

Slightly related to my other question: What is the difference between the following:

private class Joe
protected class Joe
public class Joe
class Joe

Once again, the difference between the last 2 is what I'm most interested in.

3
I've only just read your other question. Given the answers to that one, this question is redundant. Yes, they're slightly different questions - but the references given cover class accessibility as well as variables.Jon Skeet

3 Answers

16
votes

A public class is accessible to a class in any package.

A class with default access (class Joe) is only visible to other classes in the same package.

The private and protected modifiers can only be applied to inner classes.

A private class is only visible to its enclosing class, and other inner classes in the same enclosing class.

A protected class is visible to other classes in the same package, and to classes that extend the enclosing class.

1
votes
  • private: visible for outer classes only
  • protected: visible for outer classes only
  • public: visible for all other classes
  • class: package-private, so visible for classes within the same package

See JLS for more info.

1
votes

A class with default access has no modifier preceding it in the declaration.

The default access is a package-level access, because a class with default access can be seen only by classes within the same package.

If a class has default access, a class in another package won’t be able to create a instance of that class, or even declare a variable or return type. The compiler will complain. For example:

package humanity;
class Person {}

package family;
import humanity.Person;
class Child extends Person {}

Try to compile this 2 sources. As you can see, they are in different packages, and the compilation will fail.