Look at following source, please:
public class Base {
public String className = "Base";
public void setClassName(String className){
this.className = className;
}
}
public class Derived extends Base {
private String className = "Derived";
}
public class PrivateMatter {
private static void test (Base b){
System.out.println(b.className);
}
public static void main (String[] args){
Derived d = new Derived();
d.setClassName("d");
Base b = new Base();
b.setClassName("b");
test(b); // it prints b
test(d); // it prints d
}
}
I expected output:
b
Base
What should do test
? It should retrieve className
from class Base
, because in Derived
class it is private
.
However, setter setClassName
set public className
in case of class Base
and private field className
in case of Derived
. It is my intuition.
In order to sum up (my way of thinking):
Derived d = new Derived();
d.setClassName("d"); // it set private field (which did hide field from class Base)
Base b = new Base();
b.setClassName("b"); // it set public field (which is originally placed in `Base` class
test(b); // it prints b - it is ok for me
test(d); // it prints d - why ? After all, d.setClassName("d") should modify private field, however test should print public field
Could someone explain this strange thing ?