可以是';这';在Java中调用方法时省略?
关于Java(6/7/8)语法,我有一个愚蠢的问题——方法调用的这两个片段总是等价的吗可以是';这';在Java中调用方法时省略?,java,methods,this,grammar,invoke,Java,Methods,This,Grammar,Invoke,关于Java(6/7/8)语法,我有一个愚蠢的问题——方法调用的这两个片段总是等价的吗 使用此 this.myMethod(4); myMethod(4); 没有此 this.myMethod(4); myMethod(4); 注意:当然,问题在于每个参数的数量、类型和组合 较弱的语句:给定程序p,我可以只通过删除这个来创建程序p'。在每次方法调用之前吗 我考虑了本地类、匿名类、内部类和各种继承,但没有发现任何矛盾。所以我相信这两个片段实际上是相同的。不幸的是,我无法找到任何合适的证
此
this.myMethod(4);
myMethod(4);
此
this.myMethod(4);
myMethod(4);
p
,我可以只通过删除这个来创建程序p'
。
在每次方法调用之前吗
我考虑了本地类、匿名类、内部类和各种继承,但没有发现任何矛盾。所以我相信这两个片段实际上是相同的。不幸的是,我无法找到任何合适的证据(例如,从官方语法中)
你们能用矛盾来证明我错了吗?或者给我一些构造等价证明的线索?非常感谢
编辑:等价性被证明是错误的(见下面的评论)。那么较弱的语句呢?状态呢
- 如果表单是
——也就是说,只是一个MethodName
——那么:标识符
- 否则,将
设为方法所属的封闭类型声明,并将n设为整数,使T
为第n个 其声明的类的词汇封闭类型声明 立即包含方法调用。目标引用是 此的第n个词汇封闭实例T
- 否则,将
this
表示一个值
这是对对象的引用,实例方法或
调用了默认方法(§15.12),或调用了正在调用的对象
建造
及
- 如果窗体是
,然后:主窗体。涉及[TypeArguments]标识符
- 否则,将对主表达式求值,并将结果用作目标引用
Primary
这里指的是this.*
在这两种情况下,该方法将被解析为相同的方法。
鉴于所有这些信息,没有可编译程序
P'
可以从可编译程序P
创建 至少有一种情况是它们不相等。例如,此代码
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()
}
不是
因此,如果在类上定义了一个方法,则该类中声明的匿名对象可以调用其方法,而无需使用
this
,但如果它使用this
,则会导致编译器错误(假设它不提供方法名称本身的实现)。不,不能忽略它,你忘记了静态导入。好了,等价性已经过时了。那么较弱的声明呢?不会被本地方法伪装成静态导入的方法,所以当我省略这个时。
调用相同的函数?看看你较弱的语句,是的,你可以创建一个程序,但它是否有效且可编译?想一想静态方法和成员方法之间的方法签名不同的情况。这会发生吗?当然,假设输入代码有效,通过删除这个过程。
不能以任何可能的方式违反类型,是吗?是的,这是可能发生的。除非你能保证代码中没有任何与对象方法同名的静态方法,否则总是有可能把事情搞砸。这很公平。给出你的第二个代码,我可以删除这个。
并得到第一个(我的第二个问题,也就是我的陈述)。这会一直有效吗?你能给我提供一些代码吗?这个。
在方法调用之前不能省略?感谢you@petrbel没有。哦,我明白了。谢谢你的耐心-我可能误解了你回答的一部分“没有可编译的程序”。@petr,也就是说你可以添加这个。
,这样会导致它失败,如resueman的回答所示。