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

标签 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来操作objects的值,不过我觉得还是用setter比较好,这样更清晰。在这里使用“this”有什么我错过的优势吗?

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

最佳答案

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

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

在你的例子中,你总是从实例方法调用 this 所以它确实存在并且语句编译。

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

关于Java - 为什么 ClassName.this.variable 在变量为静态时起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15715954/

相关文章:

java - 不明白简单java程序的输出

java - 平台到底是什么意思?有多少个版本的 CLR 和 JVM 可用?

c++ - 在类之间共享私有(private)数据和方法

c++ - 静态成员函数和线程安全

java - 删除 View 列表中的特定 View

java - 二进制搜索不适用于 double

python - 如何使我的类中的变量成为全局变量,但仅使其在类中成为全局变量?

java - 使用反射来使用特定的类构造函数并创建新对象

c# + WebForms + 静态——最佳实践是什么?

java - 除非没有接收者,否则无法发送到无限制的 LinkedBlockingQueue?