45
class Sub {
    static int y;
    public static void foo() {
         this.y = 10;
    }
}

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

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

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

4

9 回答 9

96

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

class Sub {
    static int y;
    public static void foo() {
         y = 10;
    }
}

如果要确保获得的是静态字段y而不是同名的局部变量,请使用类名来指定:

class Sub {
    static int y;
    public static void foo(int y) {
         Sub.y = y;
    }
}
于 2012-07-26T07:41:40.087 回答
7

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

this :- “this” 表示当前类 OBJECT ,因此很明显,“this”仅在我们打算创建该类的 Object 时出现在图片中。

静态方法:- 无需创建对象即可使用静态方法。根据 Java 规则,表示“实例”或对象创建对“静态”没有任何意义。

所以会有矛盾,如果我们一起使用(静态和这个)。这就是我们不能在静态方法中使用“this”的原因。

于 2015-06-01T06:21:59.750 回答
6

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

于 2012-07-26T07:40:54.797 回答
3

为了让你的代码工作,这样写:

class Sub {
    static int y;
    public static void foo() {
         Sub.y = 10;
    }
}

您可以在静态方法中设置静态字段,但您无法this在静态方法中访问,因为this它代表对象的当前实例,而在静态方法中您没有实例。

于 2012-07-26T07:39:31.333 回答
2

这意味着“这个”对象,但没有一个。在您的情况下,您可以按照@tibtof 的建议使用类名。

于 2012-07-26T07:40:31.427 回答
1

“this”关键字仅适用于创建对象实例的情况。并且在静态方法中没有创建实例,因为静态方法属于类区域。

于 2016-03-08T06:34:07.307 回答
1

静态方法为静态字段设置值没有问题。

唯一的问题是这个关键字的使用。请注意,由于静态方法是在类加载时处理的,因此几乎可以肯定在该时间点不存在“ this ”,这就是为什么在静态上下文中不允许使用this关键字的唯一合乎逻辑的原因.

另一方面,可以从对象调用静态方法,因为它可以被对象访问。静态数据成员和行为背后的意图是使该类的所有实例都通用。

于 2021-04-16T03:25:44.447 回答
0

关键字“this”指的是您正在操作的对象。在您的情况下,this 在任何非静态方法或构造函数中(如果您有一个并且如果您在其中使用“this”),那么“this”指的是 Sub 类的特定实例。所以它仅适用于对象被创建。但是在类的静态上下文中的任何内容,您甚至可以在不为此创建对象的情况下使用它,因为它在类加载期间被解析。“this”仅在创建对象时才解决(您甚至可以动态地说出哪个对象)。所以“this”在静态上下文中是有意义的。希望能帮助到你。上帝保佑。

于 2012-07-26T08:10:31.967 回答
0

当我们声明变量和方法是静态的,那么 this 被对象共享,其中 this 关键字仅指向当前对象。假设您已经创建了 foo 类的五个对象,然后所有对象都只创建了一个由 (int y) 制成的副本。因此,如果您使用此关键字访问 int y,则编译器会不确定哪个对象必须指向,因为静态 int y 是共享的被所有人反对。您可以使用类名访问静态变量。

于 2018-05-19T17:15:57.090 回答