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)?
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.
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
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With