4

我试图完全理解“这个”是如何工作的。在我之前的帖子中,我理解了为什么我们使用“this”关键字。

我对静态的理解是该类具有该成员的一个副本。“this”用于表示当前对象。对于所有对象,静态成员变量都是相同的,那么为什么“this”对静态成员变量起作用?

代码:

public class OuterInnerClassExample
{
    public static void main(String[] args)
    {
        OuterClass outClassObj = new OuterClass(10);
        outClassObj.setInt(11);
        outClassObj.setInt(12);

        System.out.println("Total Count: " + outClassObj.getCount() );
    }
}

class OuterClass
{
    private int test;
    private static int count;       // total sum of how many new objects are created & the times all of them have been changed

    public OuterClass(int test)
    {
        this.test = test;
//      count += 1;                 // preferred as count is static
        this.count += 1;            // why does this work
    }

    public int getInt()
    {
        return this.test;
    }

    public int getCount()
    {
        return this.count;
    }

    public void setInt(int test)
    {
        this.test = test;
//      count += 1;                 // preferred as count is static
        this.count += 1;            // why does this work
    }

    class SomeClass
    {
        private OuterClass outClassObj;

        public SomeClass(int var)
        {
            outClassObj = new OuterClass(var);
        }

        public int getVar()
        {
            return this.outClassObj.getInt();
        }

        public int getCount()
        {
            return this.outClassObj.getCount();
        }

        public void setVar(int var)
        {
//          OuterClass.this.test = var;         // can do this
            outClassObj.setInt(var);            // preferred

//          OuterClass.count += var;            // should do this
            OuterClass.this.count += var;       // why does this work
        }
    }
}

另外,在 setVar 方法中,我们可以使用 ClassName.this 来操作对象的值,但我认为使用 setter 更好,因为它更清晰。我错过了在这里使用“这个”有什么好处吗?

请发布代码以显示您要解释的示例。

4

2 回答 2

5

根本原因是您可以在类名MyClass.someStaticField或类的实例上调用静态成员/方法new MyClass().someStaticField

所以只要这是“可用的”,MyClass.someStaticField就等价于this.someStaticField.

在您的情况下,您总是this从实例方法调用,因此它确实存在并且语句编译。

最后,内部类(非静态嵌套类)包含对其封闭类的引用,这也允许OuterClass.this.count编译。

于 2013-03-30T07:07:43.950 回答
0

每当您这样做(some expression).staticMember时,编译器仅使用表达式的编译时类型来确定要访问的静态成员。表达式是什么或它的值是什么并不重要。

它可能是((MyClass)null).someStaticField,它不会有所作为。

于 2013-03-30T20:33:01.297 回答