Java private, protected, public and default
You are a Java programmer, so you know what I am talking about. public
modifiers make a method or field accessible from anywhere in the application. That is the simple part. But can you tell me the difference between protected
and package private? (Hint: package private is the protection of a method or a field when you do not write any access modifier in front of it. Be aware! I lie!) My interview experience is that many do not know. Do I consider that as a no go for a Java developer? Not really. You may still be a good Java developer even if you do not know that. Perhaps now you will look it up somewhere. Perhaps the Java spec is a good document to start.
I tell you something more interesting.
Literally, none of the candidates know what
private
is. And you, reading this article, also do not know.
Ok, this is very provocative. You may be one of the few who happen to fill his brain with such a useless information and you may even have read the Java specification.
Most Java programmers think that private methods and fields are accessible only from within the class. Some even think that only from within the object instance. They believe that
public class PrivateAccessOtherObject {
public PrivateAccessOtherObject(int i) {
this.i = i;
}
private int i;
void copyiTo(PrivateAccessOtherObject other){
other.i = i;
}
}
is not possible. (It is.)
So what is private?
The recent JLS says that A private class member or constructor is accessible only within the body of the top level class (ยง7.6) that encloses the declaration of the member or constructor.
The example in the Java specification is not the best describing the rule. Perhaps that is just a simple example. Something like this may be better explaining the concept:
public class PrivateFieldsContainingClass {
private static class NestedClass {
private int i;
}
private NestedClass nestedClassInstance = new NestedClass();
void set(int i) {
nestedClassInstance.i = i;
}
int get() {
return nestedClassInstance.i;
}
}
The field i
is accessible from the enclosing class as well as from inside the NestedClass
. This example is also simple but more to the point that the specification example misses. Is there any real use of this possibility? Not really.
Bonus question: why did I say I was lying?
Comments imported from Wordpress
szjanihu 2014-07-30 22:24:06
Accessing private fields from another instance is a common thing in overridden equals() methods.
Domo 2014-07-31 09:16:19
You lie because interface methods lacking an access modifier are implicitly public. Love your blog, btw. Keep up the good work.
Peter Verhas 2014-08-07 09:31:53
Thanks for the comment. That is really a good example, it just slipped my mind. Seems I do not write
equals
methods frequent enough.
Yurij Bondarenko 2014-08-03 19:55:33
Good question for the job interview. Thank you.
Comments
Please leave your comments using Disqus, or just press one of the happy faces. If for any reason you do not want to leave a comment here, you can still create a Github ticket.