【问题标题】:In Java, what is the difference between this.method() and method()?在 Java 中,this.method() 和 method() 有什么区别?
【发布时间】:2011-09-26 16:48:09
【问题描述】:

调用this.method()method()有什么区别(包括性能区别)?

【问题讨论】:

    标签: java methods


    【解决方案1】:

    唯一重要的是您是否使用OuterClass.this.method(),例如

    class OuterClass {
        void method() { }
    
        class InnerClass {
            void method() {
                OuterClass.this.method(); // not the same as method().
            }
        }
     }
    

    【讨论】:

    • 不过,如果方法是静态的,它与 OuterClass.method() 相同
    • 严格来说,恕我直言,您不能将 OuterClass.this.method() 与 method() 进行比较,因为我们只是比较离开或放置“this”。进/出。
    • 感谢彼得提出这个特殊的例子。
    • 为什么 InnerClass 用圆括号 () 声明?
    • @Peter17,我的内置编译器坏了。 ;) 谢谢。
    【解决方案2】:

    这些构造之间绝对没有区别,并且生成的字节码将完全相同,因此不会影响性能。 this 如果未显式定义,则会在编译期间解析。

    使用显式this 的唯一原因是可读性——有些人发现它更容易阅读,因为this 暗示这是当前对象的实例方法。

    另外请注意,如果method() 是静态的,则不鼓励使用this 并具有误导性。

    private static void method() {
    }
    
    private void foo() {
        this.method();    //generates warning in my IDE for a reason
    }
    

    在这种情况下,它也不会影响性能。

    【讨论】:

    • 如果方法是静态的,它是不正确的。我的编译器会告诉我静态方法没有“this”指针。
    • @duffymo:我澄清了我对 static 方法的含义。
    • 谢谢你,托马斯。我没有反对票;你的说明很完美。
    • 有一些可读性,是的,但这也应该通过语法突出显示。对我来说,这已经成为一种(坏的?)习惯,因为打字。比 ctrl+space 更快/更舒适。
    【解决方案3】:

    在命令行上调用javap -c ClassName 可以看出没有区别。 例如:

    public class This {
        private void method() {
        }
        public void noThis() {
            method();
        }
        public void useThis() {
            this.method();
        }
    }
    

    产生以下反汇编输出:

    Compiled from "This.java"
    public class This extends java.lang.Object{
    public This();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   return
    
    public void noThis();
      Code:
       0:   aload_0
       1:   invokespecial   #2; //Method method:()V
       4:   return
    
    public void useThis();
      Code:
       0:   aload_0
       1:   invokespecial   #2; //Method method:()V
       4:   return
    
    }
    

    【讨论】:

    • 唯一的区别可能是编译时计算出隐式this的那几微秒。
    【解决方案4】:

    对于方法没有区别,但它可以对字段产生影响。考虑这段代码:

    private String someObject = "some value";
    
    public String someMethod(String someObject) {
         //this.someObject refers to the field while
         //someObject refers to the parameter
    }
    

    【讨论】:

      【解决方案5】:

      没有真正的区别 - 至少对性能没有影响。我不喜欢写“this”——IDE 通常可以突出显示对 this 的调用,而且我认为当每次访问方法/字段/...都以“this.”开头时,它的可读性会降低。但这确实是个人喜好问题。

      【讨论】:

        【解决方案6】:

        除了可读性之外没有任何区别。它使读者更清楚。

        【讨论】:

        • 可读性在旁观者看来:我觉得它更嘈杂,因为this 的信息是多余的,因为它是隐含的。它可能对新手有所帮助,但对于(大多数)更有经验的编码人员来说很烦人。
        【解决方案7】:

        使用 this.method() 和/或 this.myVar 或不使用 - 在方法上没有区别,在 vars 上可能有 - 但要保持一致。我看到它遍布整个代码,有时我什至看到this.m_myClassVar

        就我个人而言,我更喜欢在我的类 vars 前加上一个简单的下划线,并在我的方法 args 上加上一个尾随下划线:

        public MyClass
        {
            private int _myInt;
        
            public void myMethod(final int myInt_, final int fooFactor_)
            {
                _myInt = myInt_ * fooFactor_;
            }
        }
        

        虽然大多数 IDE 会明确哪个是哪个,但我发现这有助于防止分配错误,并使代码的意图更清晰,IMO 更易于阅读。

        我确实在内部类/侦听器/线程/等中使用_thisInstance.myMethod()(其中_thisInstance 是对外部类的引用)或_thisInstance._myVar。我需要清楚我在哪个类上调用什么方法和/或我需要在哪里引用一个类实例。

        【讨论】:

        • 在变量名中使用下划线违反 Java 对非常量变量的命名约定。
        【解决方案8】:

        使用 this.method() 可以清楚地表明正在调用与类实例关联的函数,而不是静态函数或属于另一个对象的函数。

        这符合那些喜欢在类中的所有成员变量前面加上“m_”的 C++ 开发人员的精神。它使所有权明确。我倾向于喜欢它,但是当您使用使用颜色和字体来阐明此类内容的 IDE 时,它并不那么重要。

        【讨论】:

        • "一个属于另一个对象" 嗯,它必须以另一个对象为前缀,不是吗? “相对于静态函数”区别重要吗?
        【解决方案9】:

        你试过在构造函数中做 this.variable 吗?

        理论上,在 C++ 中,由于尚未创建对象,因此没有 this。我不确定 Java 中的情况。

        【讨论】:

        • 在 Java 中工作,因为 this.foo = foo; 是一种非常常见的模式,用于从同名参数初始化字段(成员变量)。
        猜你喜欢
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 2019-08-21
        • 2014-09-14
        • 2011-11-23
        • 2011-07-30
        相关资源
        最近更新 更多