我对Java(6/7/8)语法有愚蠢的疑问 - 方法调用的两个片段总是等同吗?
this
this.myMethod(4);
没有this
myMethod(4);
注意:当然问题在于每个数字,类型和参数组合
较弱的陈述:给定程序P
,我是否可以通过在每个方法调用前删除P'
来创建程序this.
?
我已经考虑了本地类,匿名类,内部类和各种继承,但可能没有发现任何矛盾。所以我相信两个片段实际上都是一样的。不幸的是,我无法找到任何合适的证据(例如来自官方语法)。
你能否通过矛盾证明我错了,或者给我一些构建等价证据的线索?非常感谢。
编辑:等价被证明是错误的(见下面的评论)弱的陈述怎么样?
答案 0 :(得分:2)
- 如果表单为
MethodName
- 也就是Identifier
- 那么:
- 否则,让
T
成为该方法所属的封闭类型声明,并且让n为整数,使T
为n' 词法封闭类型声明的类声明 立即包含方法调用。目标参考是 第n个词汇封闭this
的实例。
和
当用作主表达式时,关键字
this
表示值 这是对实例方法或对象的引用 默认方法被调用(第15.12节),或被调用的对象 构造
和
- 如果表格涉及
Primary . [TypeArguments] Identifier
,则:
- 否则,将评估Primary表达式,并将结果用作目标引用。
Primary
此处提及this.*
。
在这两种情况下,该方法将被解析为相同的方法。
鉴于所有这些信息,没有可编译程序P'
可以从可编译程序P
创建。
答案 1 :(得分:1)
至少有一个案例并不等同。例如,此代码
void doStuff(){}
void test(){
Runnable r = new Runnable(){
@Override
public void run(){
doStuff();
}
};
r.run()
}
完全有效,而这
void doStuff(){}
void test(){
Runnable r = new Runnable(){
@Override
public void run(){
this.doStuff();
}
};
r.run()
}
ISN'吨
因此,如果您在类上定义了一个方法,那么在该类中声明的匿名对象可以在不使用this
的情况下调用它的方法,但如果它使用this
,则会导致编译器错误(假设它没有提供方法名称本身的实现)。