Java “隐式”是什么意思;这";在匿名类中引用?

Java “隐式”是什么意思;这";在匿名类中引用?,java,this,anonymous-inner-class,Java,This,Anonymous Inner Class,在下面的代码中,我注意到我可以在不引用HelloWorld对象的情况下调用getWorld()?但是隐式的'this'关键字现在不是指内部匿名类吗?如果是,为什么我可以调用getWorld() 忽略代码中的递归。调用getWorld您将跳出匿名类并返回到顶级类,因此此引用正在创建匿名类的对象 这就像从另一个类调用一个方法,这里的this引用一个不同的对象(不是调用方,而是被调用方)。调用getWorld你会跳出匿名类,回到顶级类,因此this引用创建匿名类的对象 这就像从另一个类调用一个方法,这

在下面的代码中,我注意到我可以在不引用HelloWorld对象的情况下调用getWorld()?但是隐式的'this'关键字现在不是指内部匿名类吗?如果是,为什么我可以调用getWorld()


忽略代码中的递归。

调用
getWorld
您将跳出匿名类并返回到顶级类,因此
引用正在创建匿名类的对象


这就像从另一个类调用一个方法,
这里的this
引用一个不同的对象(不是调用方,而是被调用方)。

调用
getWorld
你会跳出匿名类,回到顶级类,因此
this
引用创建匿名类的对象

这就像从另一个类调用一个方法,
这个
引用了一个不同的对象(不是调用方,而是被调用方)。

答案就在这里

如果它是一个简单的名称,即仅仅是一个标识符,那么方法的名称就是标识符

如果标识符出现在具有该名称的可见方法声明范围内(§6.3,§6.4.1),则:

  • 如果有一个封闭类型声明,该方法是该声明的一个成员,那么让T作为最内部的类型声明。要搜索的类或接口是T
通过仅使用方法的简单名称,要调用的方法的解析将通过封闭的方法进行查找,直到找到一个具有该名称的方法,然后尝试使用该方法(或多个方法)来查找精确匹配

这与使用
This.getWorld()
的情况不同,因为
This
明确地引用了内部类实例。这导致了不同类型的解析(规范的
Typename.Identifier
部分,就在链接的引号下面),它不查看封闭的外部类

这样做的一个有趣的结果是,您可以通过向具有相同名称但具有不同arity的内部类添加方法来停止代码的编译。由于它仅在尝试确定要解析的类实例时搜索名称本身,因此它将尝试使用内部类,但不会找到精确的匹配方法

因此:

public class HelloWorld {
    public void getWorld() {
        this.setListener(new MyListenerInterface(){
            @Override
            public void innerMethod() {
                getWorld();
            }
            void getWorld(int i){}
        });
    }
}
不会编译。方法名称解析将在内部类中发现
getWorld
,因此将停止向上搜索层次结构。但是当它尝试进行算术解析时,它将看到类中的(一)个
getWorld
方法都不匹配,并且将失败

TL;DR-仅使用简单名称与使用
this.method()
完全相同,尽管它的计算结果通常是相同的。语言规范有处理这种情况的特定规则,允许它在任何封闭实例中查找匹配的方法。

答案在中

如果它是一个简单的名称,即仅仅是一个标识符,那么方法的名称就是标识符

如果标识符出现在具有该名称的可见方法声明范围内(§6.3,§6.4.1),则:

  • 如果有一个封闭类型声明,该方法是该声明的一个成员,那么让T作为最内部的类型声明。要搜索的类或接口是T
通过仅使用方法的简单名称,要调用的方法的解析将通过封闭的方法进行查找,直到找到一个具有该名称的方法,然后尝试使用该方法(或多个方法)来查找精确匹配

这与使用
This.getWorld()
的情况不同,因为
This
明确地引用了内部类实例。这导致了不同类型的解析(规范的
Typename.Identifier
部分,就在链接的引号下面),它不查看封闭的外部类

这样做的一个有趣的结果是,您可以通过向具有相同名称但具有不同arity的内部类添加方法来停止代码的编译。由于它仅在尝试确定要解析的类实例时搜索名称本身,因此它将尝试使用内部类,但不会找到精确的匹配方法

因此:

public class HelloWorld {
    public void getWorld() {
        this.setListener(new MyListenerInterface(){
            @Override
            public void innerMethod() {
                getWorld();
            }
            void getWorld(int i){}
        });
    }
}
不会编译。方法名称解析将在内部类中发现
getWorld
,因此将停止向上搜索层次结构。但是当它尝试进行算术解析时,它将看到类中的(一)个
getWorld
方法都不匹配,并且将失败


TL;DR-仅使用简单名称与使用
this.method()
完全相同,尽管它的计算结果通常是相同的。语言规范有处理这种情况的特定规则,允许它在任何封闭实例中查找匹配的方法。

我想他是在询问Java语言本身的工作原理。你是对的,这就是它正在做的事情,但为什么呢?我想他是在问Java语言本身的工作原理。你是对的,这就是它正在做的,但为什么?