【问题标题】:Java - Why does ClassName.this.variable work when variable is static? [duplicate]Java - 为什么当变量是静态的时 ClassName.this.variable 工作? [复制]
【发布时间】:2013-03-20 21:42:53
【问题描述】:

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

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

【问题讨论】:

  • 我的猜测是编译器确定了您的意图并忽略了“this”。字首。例如,Eclipse 允许您为此启用警告或错误(“对静态成员的非静态访问”。)

标签: java class static this object-composition


【解决方案1】:

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

可能是((MyClass)null).someStaticField,但不会有什么不同。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2014-01-15
      • 1970-01-01
      • 2013-05-25
      • 2013-08-16
      • 2012-12-11
      相关资源
      最近更新 更多