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 ?
 
     
    