Why does the following Java code produces:
10
superclass
The code in question is:
class SuperClass {
    int a;
    public SuperClass() {
        this.a = 10;
    }
    private void another_print() {
        System.out.println("superclass");
    }
    public void print() {
        System.out.println(this.a);
        this.another_print();
    }
}
class SubClass extends SuperClass {
    int a;
    public SubClass() {
        this.a = 20;
    }
    private void another_print() {
        System.out.println("subclass");
    }
    public void print() {
        super.print();
    }
}
public class Main {
    public static void main (String[] args) {
        SubClass c = new SubClass();
        c.print();
    }
}
There is no instance of SuperClass ever created, isn't there?
Not only that Java starts looking for the method to invoke from the SuperClass, it even somehow knows that a = 10!
Let's consider a similar Python code:
class SuperClass:
    def __init__(self):
        self.a = 10
    def another_prn(self):
        print('superclass')
    def prn(self):
        print(self.a)
        self.another_prn()
class SubClass(SuperClass):
    def __init__(self):
        self.a = 20
    def another_prn(self):
        print('subclass')
    def prn(self):
        super().prn()
c = SubClass()
c.prn()
It works as I expect:
20
subclass
The only explanation that my colleagues (Python disliking Java folks) came up with is: "Python is not a true OOP language". Not very convincing at all.
Update: private void another_print() is my blunder, I should have used protected.