Howdy,
You have the right idea -- 'protected' is different from the other three access levels because access to a protected member is ONLY through inheritance. In other words, with 'protected' a subclass gets access to the superclass protected member only by 'inheriting' the member -- but the subclass (outside the package of the superclass) does NOT get any special ability to access the protected member in any other way except for inheritance.
So, a subclass outside the package does not get to make an instance of the superclass, and then use that superclass reference to access the protected member. If you think of 'protected == inheritance', that will help you remember that inheritance is the only way in which protected is different from default. Protected is exactly the same as default for classes inside the same package.
But outside the package... protected is a special way for a superclass to say, "I want my children to inherit this method, that's the only way it can be used once my children move away (i.e. leave the package)"
Then the question is... so what happens to the protected member when it is inherited by a subclass outside the package? And you have 90% of the answer when you say that it behaves as though it were private. It does, almost. For example, if class Mini is a subclass of class Car, but Mini is the the "coolcars" package while Car is in a "vehicles" package, class Mini inherits the protected go() method of class Car. That is the only way Mini gets to use the method... by simply HAVING the method through inheritance. Mini HAS the method, but it cannot INVOKE the method on any other object (except other Minis, of course).
But now what about the other classes in the new "coolcars" package? Do they get to access the method through a reference to Mini? No. Once that method is inherited *outside* the package in which it was declared, nobody else in the Mini's package can access it. It acts 'private'. The only way to invoke it is to call some other method on Mini that Mini exposes to the outside world, and then that method in turn calls another Mini method -- the protected method that Mini inherited.
Hmmmm.... that's *almost* right. There is an exception here -- which is if there is a new subclass of Mini! Other subclasses of Mini still get access to the protected member that Mini inherited, but ONLY by also inheriting the protected member.
So, bottom line: once outside the package, a protected member can be accessed ONLY through inheritance. A subclass outside the package will INHERIT the protected member, but that is the only way the member can ever be accessed by any class outside the package. The inheritance of the protected member extends down the inheritance tree to subclasses of subclasses, but to any other class outside the original package of the superclass that declared the protected member, that member is essentially private.
Protected == inheritance, for any class outside the package of the class with the protected member.
For classes INSIDE the package of the class declaring the protected member, protected == default.
So, the final result is:
Protected is the same as default for all classes inside the package declaring the protected member.
Protected is the same as private for all classes outside the package of the class declaring the protected member, EXCEPT for all subclasses. And to those subclasses, they can access the member ONLY through inheritance.
Cheers,
Kathy