Home » Java » Core Java » Java private, protected, public and default

About Peter Verhas

Peter Verhas

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’ll 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?

Reference: Java private, protected, public and default from our JCG partner Peter Verhas at the Java Deep blog.
(0 rating, 0 votes)
You need to be a registered member to rate this.
4 Comments Views Tweet it!
Do you want to know how to develop your skillset to become a Java Rockstar?
Subscribe to our newsletter to start Rocking right now!
To get you started we give you our best selling eBooks for FREE!
1. JPA Mini Book
2. JVM Troubleshooting Guide
3. JUnit Tutorial for Unit Testing
4. Java Annotations Tutorial
5. Java Interview Questions
6. Spring Interview Questions
7. Android UI Design
and many more ....
Email address:

Leave a Reply

3 Comment threads
1 Thread replies
Most reacted comment
Hottest comment thread
2 Comment authors
Sankalp SuryawanshiPeter Verhas Recent comment authors
newest oldest most voted
Notify of
Sankalp Suryawanshi

I think you the stuff you lie is about default access. So in the case of no modifier (default), whether the subclass can see it’s superclass’s methods/fields depends on the location of the subclass . If the subclass is in another package, then the answer is it can’t. If the subclass is in the same package then it CAN access the superclass methods/fields. One example: package myarea; public class MyHome{ private int frontDoorLock; public int myAddress; int defaultWifiPaswd; } package myarea; public class MyBedroom{ public static void main(String[] args) { MyHome a = new MyHome(); int v1 = a.myAddress; //… Read more »

Sankalp Suryawanshi

My post is in response to your question ”Bonus question: why did I say I was lying?

Peter Verhas
Peter Verhas

Dear Sankalp,

your example is a very good example how package private fields and methods work, where they are accessible from and where and when are they unreachable. The actual lie is somewhere else. If you consider the statement:

The statement

“package private is the protection of a method or a field when you do not write any access modifier in front of it”

is a bit vague. Not precise. Think of interfaces!

Sankalp Suryawanshi
Sankalp Suryawanshi

Exactly Peter!

Actually Interface’s thought came to my mind, because all fields defined in interface are always public (and even static +final). Am I missing some more you hinted ? :)