为何Groovy中嵌套类可调用自身未定义的外部类方法?
为什么Groovy中
Outer.Inner.out()能调用Outer的静态方法? 先看你给出的代码:
class Outer { static void out() { System.out.println("hello world"); } static class Inner { } static void main(String[] args) { //Intellij Note: No candidates found for method call Outer.Inner.out(); } }
这段代码运行后确实会输出hello world,哪怕Inner静态类里根本没定义out()方法,这是Groovy对静态成员调用的宽松规则导致的。
核心原因
Groovy在解析静态方法调用时,和Java的严格规则存在差异:
- Java要求必须通过定义该静态方法的类直接调用,否则编译报错;
- 而Groovy会在调用路径的类层次中向上回溯查找:当你调用
Outer.Inner.out()时,Groovy先检查Inner类有没有静态out()方法,发现没有后,会自动去它的外围类Outer中查找,找到Outer的静态out()方法就直接执行。
这种行为是Groovy对静态成员访问的灵活扩展,属于官方文档提到的「嵌套类实现和Java存在差异」的具体表现之一——文档里只提到了局部变量无需final的差异,而静态成员的向上查找规则是另一个未详细说明的实现差异。
补充验证
如果给Inner类也定义一个静态out()方法:
static class Inner { static void out() { System.out.println("inner hello"); } }
此时Outer.Inner.out()会优先调用Inner的out()方法,输出inner hello,只有当Inner没有对应静态方法时,Groovy才会去外围类找。
内容的提问来源于stack exchange,提问作者Hai Shi
相关产品推荐
相关产品推荐

