Java and Access Specifiers
So many times there is confusion about java and its access specifers. Here’s what they mean once and for all.
Public: Available to all wherever you may be.
Private: Available only to me.
Protected: Available to my derived types.
Friend: Available to all who belong to my group (package) i.e. are my friends.
Naturally, if I make a class private it can’t be accessed by anyone except the class itself! Now trying make a class protected. Then it will available to only its derived types. But its protected and you cant derive a type. Hence classes don’t have private/protected specifiers. They have only public / friend specifiers.
However pick any class member and you can safely say it can be either public, private, protected or friend.
That’s good enough. But real java code will be a mix of public/friend classes with members at different access levels. The matrix is revealed below:
The following is a list of classes we have:
| Class | Access | Package |
| A | Public | com.test |
| B | Public or Friend | com.test |
| C extends A | Public of Friend | com.test |
| D | Public of Friend | com.testother |
| E extends A | Public of Friend | com.testother |
Lets see what members of A are accessible to what members of B, C, D, E. Classes B, C are in same package as A while D, E are outside of the package that A belongs to.
| Non static members of A | Can be accessed by | Can be overridden by |
| Public | B, C, D, E | C, E |
| Protected | C, E | C, E |
| Friend | B, C | C |
| Private | None | None |
Now lets apply the above to a friend class.
The following is a list of classes we have:
| Class | Access | Package |
| F | Friend | com.test |
| G | Public or Friend | com.test |
| H extends F
| Public of Friend | com.test |
Naturally here I consider classes only in same package as F.
Lets see what happens here.
| Non static members of F | Can be accessed by | Can be overridden by |
| Public | G, H | H |
| Protected | H | H |
| Friend | G, H | H |
| Private | None | None |
Note that static public members of F can be accessed outside the package !