Java - 为什么ClassName.this.variable在变量是静态时工作?

时间:2013-03-30 07:02:31

标签: java class static this object-composition

我正在努力完全理解“这个”是如何工作的。在我的previous post中,我理解了为什么我们使用“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,因为它更清晰。在这里使用“这个”有什么好处,我错过了吗?

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

2 个答案:

答案 0 :(得分:5)

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

只要“可用”,MyClass.someStaticField相当于this.someStaticField

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

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

答案 1 :(得分:0)

每当执行(some expression).staticMember时,编译器仅使用表达式的编译时类型来确定要访问的静态成员。表达式是什么或它评估的值无关紧要。

它可能是((MyClass)null).someStaticField,它不会产生任何影响。