DevOps Zone is brought to you in partnership with:

I am a senior software architect specializing currently in enterprise Java development. I have past experience with JavaScript, python, C and going back in time even FORTRAN and assembly were still not extinct at the start of my career. Currently I work on different customer projects on behalf of EPAM system leading a 8 person agile group. As a hobby independently from my employer I maintain and develop open source projects, like ScriptBasic Classic, ScriptBasic for Java, License3j (google them if interested). Peter is a DZone MVB and is not an employee of DZone and has posted 32 posts at DZone. You can read more from them at their website. View Full User Profile

Java private, protected, public and default

08.04.2014
| 3780 views |
  • submit to reddit

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?

Published at DZone with permission of Peter Verhas, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)