Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is it allowed to access a private field of another object?

Tags:

java

private

Recently, I observed an unexpected behavior of accessing priavte fields in Java. Consider the following example, which illustrates the behavior:

public class A {

    private int i;  <-- private field!

    public A(int i) {
        this.i = i;
    }

    public void foo(A a) {
        System.out.println(this.i);  // 1. Accessing the own private field: good
        System.out.println(a.i);     // 2. Accessing private field of another object!
    }

    public static void main(String[] args) {
        (new A(5)).foo(new A(2));
    }
}

Why I am allowed to access the private field of another object of class A within the foo method (2nd case)?

like image 622
John Threepwood Avatar asked May 16 '13 11:05

John Threepwood


2 Answers

Private fields protect a class, not an instance. The main purpose is to allow a class to be implemented independently of its API. Isolating instances between themselves, or protecting the instance's code from the static code of the same class would bring nothing.

like image 161
Denys Séguret Avatar answered Sep 19 '22 16:09

Denys Séguret


This is because they are of the same class. This is allowed in Java.

You will need this access for many purposes. For example, in an implementation of equals:

public class A {
  private int i;

  @override public boolean equals(Object obj){
     if(obj instanceof A){
        A a = (A) obj;
        return a.i == this.i; // Accessing the private field
     }else{
       return false
     }
  }
}
like image 27
Mohayemin Avatar answered Sep 21 '22 16:09

Mohayemin