0

静的メソッドのフィールドを参照するときにキーワード「this」を使用できないのはなぜですか?

参照変数を介して静的メンバーにアクセスすることは問題ないと考えましたが、そのthisようなメンバーにアクセスするために使用することは問題ありません。以下のコードを見てください。

static int month; 

public static void setMonth(int x)
{ 
Date date = new Date();
date.month = x;  //fine, why ?
    this.month = x;  //compiler error, why ?
}

this参照変数と同じではないことを明確に示しています。もしそうなら、それは本当は何ですか?this静的コンテキストからアクセスできない理由を理解するには、 の本当の意味を理解する必要があります。

this静的なコンテキストからは使用できないと言っているランダムなブログやオラクルのチュートリアルへのリンクを私に与えないでください-私はすでにそれを知っています. その先を見据えて、なぜ使えないのかを理解したい。

リンクされた質問のコード -

public class Date
{

static int month; 

public static void setMonth(int x)
{ 
 this.month = x;  //compiler error
}

public static int getMonth()
{
 return month;  //compiles just fine, no error
}

}
4

6 に答える 6

3

myObject.myMethod()などの非静的メソッドを呼び出すと、コンパイラは、メソッド内で「this」として使用できる「myObject」という値の追加のシークレットパラメータを追加します。

MyClass.myStaticMethod()などの静的メソッドを呼び出す場合、シークレットパラメータの値を割り当てるオブジェクトがないため、追加のシークレットパラメータがないため、「this」は静的メソッド内に値を持つことができません。

于 2013-03-24T00:51:59.283 に答える
2
public static void setMonth(int x)
{ 
 this.month = x;  //compiler error
}

this現在のオブジェクト インスタンスを参照します。静的メソッドは特定のインスタンスではなく、クラス全体に関連付けられているため、静的メソッドにはそのようなことはありません。

thisしたがって、静的メソッドではまったく使用できません。

参照するフィールド ( month) が実際にはインスタンス フィールドではなく静的フィールドであることは問題ではありません。ここでは必要ありませんでしthisたが、アクセスしようとすると、コンパイラが停止します。

public static int getMonth()
{
 return month;  //compiles just fine, no error
}

month静的フィールドです。静的メソッドと同様に、クラス自体に属しており、インスタンスを解決する必要はありません。

于 2013-03-24T00:46:14.887 に答える
1

完全を期すためにthis、静的フィールドが存在するように非静的コードで実行されている場合は、静的フィールドを参照するために実際に使用できますthis。存在しないところでthisはできません。

public class Test {
  static int month;
  public static void main(String[] args) {
    new Test().setMonth(5);
    System.out.println(month);
  }
  public void setMonth(int x)
  { 
      this.month = x;
  }
}
于 2013-03-24T01:10:55.957 に答える
1

意味を理解すれば、それは本当に非常に簡単ですstatic

キーワード (そのthisように使用する場合) は、「現在のオブジェクト」を意味します。

メソッドを として宣言するstaticと、特定のオブジェクトを現在のオブジェクトとして指名せずにメソッドが常に呼び出されると言っています。したがって、staticメソッド内にいる場合、「現在の」オブジェクトはありません...そして論理的な結果として、this意味がないため使用できません。

インスタンスメソッドまたはコンストラクター1にいる場合、「現在の」オブジェクトのみがあります。前者の場合、「現在の」オブジェクトは、メソッドを呼び出したオブジェクトです。後者の場合、それはあなたが作成しているオブジェクトです。


1 ... またはインスタンス初期化ブロック

于 2013-03-24T00:58:44.660 に答える
1

あなたのコードでは、date.month = x;は正確に同等でDate.month = x;あり、それがコンパイル時にコンパイラが行うことです。左側に何を入れるかは、実際には問題ではありません。この理由から、参照を介して静的フィールドまたはメソッドにアクセスすることはお勧めできません。式のコンパイル時の型のみが重要です。検討

(new Date()).month = x;
((Date)null).month = x;
// suppose SubDate is a subclass of Date, with its own static "month" field
((Date)new SubDate()).month = x;

上記のすべてのことは、まったく同じことを行います。

だからあなたが言うとき

参照変数を介して静的メンバーにアクセスすることは問題ないと考えました

参照変数を介した静的メンバーへのアクセスは使用しないでください。それは、多くの誤解やバグにつながる巨大な錯覚だからです。おそらく Java では許可されるべきではありませんでした。

于 2013-03-24T06:25:18.130 に答える
0

キーワードthisは、現在のオブジェクトインスタンスを参照します。

Javastaticの概念の定義によるインスタンスがないため、コンテキストから使用することはできません。staticメソッドには、すべてのインスタンスstaticからアクセスできます。

public static final class MyClass {

    public static final class MyInnerClass {

        public void doStuff() {
            System.out.println(this.toString());
        }

        @Override
        public String toString() {
            return "MyInnerClass toString.";
        }
    }

    public void doStuff() {
        System.out.println(this.toString());
        new MyInnerClass().doStuff();
    }

    @Override
    public String toString() {
        return "MyClass toString.";
    }
}

public static void main(String[] args) throws InterruptedException {
    new MyClass().doStuff();
}

出力

MyClass toString.
MyInnerClass toString.

したがって、thisdoStuffメソッドは、が呼び出された内からMyClassのインスタンスを参照します。MyClassdoStuff

thisinは、のインスタンスではなく、呼び出し元MyInnerClassのインスタンスを指します。MyClassMyInnerClassdoStuff

this 常に、キーワードが使用されているオブジェクトのインスタンスを参照します。staticメソッドの場合のようにインスタンスがない場合、thisキーワードは使用できません。

于 2013-03-24T00:50:50.667 に答える