Groovy和Java静态变量行为

Groovy和Java静态变量行为,java,groovy,Java,Groovy,最近我一直在做一些Java和Grails3编程。 我发现了一些我不理解的行为 有两个groovy类: class Super { static String desc = "Super" } 及 现在,我正在Java和Groovy中运行以下代码: Super aSuper = new Super(); Sub sub = new Sub(); Super superSub = new Sub(); System.out.println("Super object: [" + aSup

最近我一直在做一些Java和Grails3编程。 我发现了一些我不理解的行为

有两个groovy类:

class Super {
    static String desc = "Super"
}

现在,我正在Java和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
在这两种情况下,1,2,4,5的结果相同,并且易于预测([Super]、[Sub]、[Super]、[Sub])

但在第3种情况下,当运行上述代码时,Java类输出将是:
子对象,超级引用:[super]
从Groovy中,它将产生:
Sub对象,super引用:[Sub]


为什么Groovy对
静态
变量的解释不同?

正如@dmahapatro所说,它是基于,但这是一个微妙的例子。在文档中,该示例基于给定参数的方法选择,其中变量为参数所持有实例的父类型。Java在编译时选择方法签名,因为当时它只有参数变量声明类(Object),而不是实例类(String)。Groovy延迟了它的决定,因此它可以确定参数变量引用的实例的类,并使用该类来确定哪个方法签名最匹配

在上面的示例中,当您指的是基于类而不是基于实例的静态成员时,Java的继承思想(虚拟方法)并没有发挥作用。Java再次从引用变量类(Super.desc)中选择静态变量。Groovy再次采用延迟的、基于实例的路径,并询问实例它的静态成员是什么(Sub.desc)


注意,大多数人会考虑3的坏风格(询问一个类静态成员的值是什么),所以它不应该正常出现。

良好的观察,这是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