可以是这个'在Java中调用方法时省略了什么?

时间:2014-09-25 16:11:28

标签: java methods this grammar invoke

我对Java(6/7/8)语法有愚蠢的疑问 - 方法调用的两个片段总是等同吗?

  1. this

    this.myMethod(4);
    
  2. 没有this

    myMethod(4);
    
  3. 注意:当然问题在于每个数字,类型和参数组合

    较弱的陈述:给定程序P,我是否可以通过在每个方法调用前删除P'来创建程序this.

    我已经考虑了本地类,匿名类,内部类和各种继承,但可能没有发现任何矛盾。所以我相信两个片段实际上都是一样的。不幸的是,我无法找到任何合适的证据(例如来自官方语法)。

    你能否通过矛盾证明我错了,或者给我一些构建等价证据的线索?非常感谢。

    编辑:等价被证明是错误的(见下面的评论)弱的陈述怎么样?

2 个答案:

答案 0 :(得分:2)

Java Language Specification

  
      
  • 如果表单为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,则会导致编译器错误(假设它没有提供方法名称本身的实现)。