I have been doing some Java and Grails3 programming recently. I found some behavior that I don't understand.
There are two groovy classes:
class Super {
static String desc = "Super"
}
and
class Sub extends Super {
static String desc = "Sub"
}
Now, I'm running following code in Java and Groovy:
Super aSuper = new Super();
Sub sub = new Sub();
Super superSub = new Sub();
System.out.println("Super object: [" + aSuper.getDesc() + "]"); //1
System.out.println("Sub object: [" + sub.getDesc() + "]");//2
System.out.println("Sub object, super reference: [" + superSub.getDesc()+ "]");//3
System.out.println("Super reference: [" + Super.getDesc()+ "]");//4
System.out.println("Sub reference: [" + Sub.getDesc()+ "]");//5
Results of 1,2,4,5 are the same in both cases and easy to predict ([Super], [Sub], [Super], [Sub])
But in case number 3 when running above code form Java class output will be: Sub object, super reference: [Super]
And from Groovy it will result in: Sub object, super reference: [Sub]
Why is Groovy interpretation of static variable different?