Ramana
Ramana

Reputation: 1

java private access modifier can be accessed out side of the class?

Why java compiler is not restricting from accessing a private attribute from other class? I have inner class which has a attribute 'a' with modifier 'private'. I can able to access this variable with its instance variable out side the class. see the code below.

package com.test;

public class Test {

    public Test() {
    }

    public static void main(String[] args) {
        new Test().execute(); // test method
    }

    public void execute() {
        InnerClass innerClassInstance = new InnerClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerClassInstance.a);

        InnerStaticClass innerStaticClassInstance = new InnerStaticClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerStaticClassInstance.a);
    }

    private final class InnerClass {
        private int a; // accessible only in InnerClass??
    }

    private final static class InnerStaticClass {
        private int a; // accessible only in InnerClass??
    }
}

Upvotes: 0

Views: 243

Answers (4)

Nishant
Nishant

Reputation: 55866

A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Sorry, I misread the question.

Looks at JLS http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

Otherwise, if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

So, a field in inner-class (which is obviously inside class body) can be accessed by outer class even if it's private.

Upvotes: 2

Balaswamy Vaddeman
Balaswamy Vaddeman

Reputation: 8530

These nested classes are meant for that .When you have private members in a class ,we write nested class to do unit testing.

Upvotes: 0

Nagaraju Badaeni
Nagaraju Badaeni

Reputation: 900

your Inner class is a member of your Test class so, Test class can access private member of Inner class too.

Try like this it will give compile error

public class Test {

public Test() {
}

public static void main(String[] args) {
    new Test().execute(); // test method
}

public void execute() {
    InnerClass innerClassInstance = new InnerClass();
    // accessing private member from other class instance, HOW?
    System.out.println(innerClassInstance.a);

    InnerStaticClass innerStaticClassInstance = new InnerStaticClass();
    // accessing private member from other class instance, HOW?
    System.out.println(innerStaticClassInstance.a);
}

}

class InnerClass { private int a; // accessible only in InnerClass?? }

final class InnerStaticClass { private int a; // accessible only in InnerClass?? }

Upvotes: 0

Robin
Robin

Reputation: 36611

See the Java language specification:

Otherwise, if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

Upvotes: 1

Related Questions