Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以是';这';在Java中调用方法时省略?_Java_Methods_This_Grammar_Invoke - Fatal编程技术网

可以是';这';在Java中调用方法时省略?

可以是';这';在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'。在每次方法调用之前吗 我考虑了本地类、匿名类、内部类和各种继承,但没有发现任何矛盾。所以我相信这两个片段实际上是相同的。不幸的是,我无法找到任何合适的证

关于Java(6/7/8)语法,我有一个愚蠢的问题——方法调用的这两个片段总是等价的吗

  • 使用

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

    this.myMethod(4);
    
    myMethod(4);
    
  • 注意:当然,问题在于每个参数的数量、类型和组合

    较弱的语句:给定程序
    p
    ,我可以只通过删除
    这个来创建程序
    p'
    在每次方法调用之前吗

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

    你们能用矛盾来证明我错了吗?或者给我一些构造等价证明的线索?非常感谢

    编辑:等价性被证明是错误的(见下面的评论)。那么较弱的语句呢?

    状态呢

    • 如果表单是
      MethodName
      ——也就是说,只是一个
      标识符
      ——那么:
      • 否则,将
        T
        设为方法所属的封闭类型声明,并将n设为整数,使
        T
        为第n个 其声明的类的词汇封闭类型声明 立即包含方法调用。目标引用是 此的第n个词汇封闭实例

    当用作主表达式时,关键字
    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的回答所示。