为什么我们不能在静态方法中使用'this'关键字

Pra*_*ani 33 java oop static this

class Sub {
    static int y;
    public static void foo() {
         this.y = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

我理解,它this代表调用该方法的对象,并且静态方法不绑定到任何对象.但在上述情况下,变量y也是静态的.

如果我们可以在类对象上调用静态方法,为什么我们不能允许静态方法来设置类的静态变量.

这个附加约束的目的是什么?

bri*_*ium 80

因为this是指对象实例.在静态方法的调用中没有对象实例.但是当然你可以访问静态字段(只有静态字段!).只是用

class Sub {
    static int y;
    public static void foo() {
         y = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要确保获取静态字段y而不是某个具有相同名称的局部变量,请使用类名指定:

class Sub {
    static int y;
    public static void foo(int y) {
         Sub.y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • downvoters可能认为这并没有真正回答这个问题,因为你基本上重复了OP已经知道的事情,并且只提供了一个冗长的解决方法.如果该类名为`ThisClassHasAQuiteLongName`,那么在静态方法中将类引用为"this"会不会更好? (3认同)
  • 正如我所理解的那样,我也想知道的问题是,为什么Java不会在静态上下文中重写"this"的含义来表示类,所以不是`Sub.y`而是可以输入`this. y`.这似乎是一个明显的设计选择,因为它消除了明确提到可能改变的类名的需要.一般来说,当有人问"为什么x被定义为y而不是z在不同的上下文中"时,它并不令人满意,并且确实有点有毒并且居高临下地回答"因为它被定义为y".这让我感到愚蠢,因为我仍然如此. (3认同)

mrs*_*dge 6

this指的是该对象的这个实例Sub.由于方法是static,没有一个实例Sub.


小智 6

我们不能在静态方法上下文中使用"this"的主要原因: -

这个: - "this"表示当前的类OBJECT,所以很明显,只要我们打算创建该类的Object,"this"才会出现在图片中.

静态方法: - 不需要创建对象以使用静态方法.根据Java规则,"实例"或对象创建对"静态"没有任何意义.

所以如果我们同时使用它们(静态和这个)会有矛盾.这就是我们不能在静态方法中使用"this"的原因.