Start here. This is the direct spoken answer to practice first.
Overview
Access control is most useful when it keeps implementation choices local and makes the supported API obvious.
private restricts a member to its declaring top-level class and nested-class relationship. With no modifier, package-private access keeps it inside the same package. protected also exposes it to subclasses, with Java-specific rules for cross-package access. public exposes it wherever the containing type is accessible. I start with the narrowest access that supports the design, because every public or protected member becomes a contract that callers or subclasses may depend on.