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