4

「これ」がどのように機能するかを完全に理解しようとしています。前回の投稿で、「this」キーワードを使用する理由がわかりました。

静的についての私の理解は、クラスにはそのメンバーのコピーが 1 つあるということです。「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 に答える