 One of the key features of Java is the ability to set the accessibility, or visibility, of a class's members, its properties and methods. We've used the public access modifier to allow complete access to properties and methods, and private to allow access only within the class where the methods and properties are defined. Sometimes you need to adjust visibility somewhere between those extremes. There are four places where access can happen. Access from the same class, access from a class in the same package, access from a subclass in a different package, and access from a different package entirely. The most visible and least restrictive option is public, allowing access everywhere. The next less visible option is protected, which allows access from everywhere except a different package. If you don't specify any access modifier, you get the default visibility. Class members are accessible only in the same class, or the same package where they were defined. Finally, the least visible and most restrictive option is private, which allows access only from the same class. The book says it quite nicely. Use private for things that are not for use outside the class. Use public for things that are intended for people who are using the class. And use protected for things that are intended for extenders of the class, but not users of the class. One additional note. If you override a method in a subclass, you can make it more visible. In this example, the child class makes its overridden version of a protected class public. However, you cannot make a method less visible. If you try to override a protected method and make it private, the compiler will stop you. And here, again, is the table summarizing the visibility modifiers in Java.