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

时间:2012-07-26 07:36:21

标签: java oop static this

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

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

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

此额外约束的目的是什么?

10 个答案:

答案 0 :(得分:76)

因为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;
    }
}

答案 1 :(得分:6)

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

答案 2 :(得分:6)

我们不能使用"这个"在静态方法上下文中: -

这个: - "这个"意味着当前的类OBJECT,因此它明确表示"这个"只进来 一旦我们打算创建该类的对象,该图片。

静态方法: - 无需创建对象即可使用静态方法。 意味着"实例"或者对象创建对于"静态"没有任何意义。根据Java规则。

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

答案 3 :(得分:2)

要使代码工作,请按以下方式编写:

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

关键字"此"指的是您正在操作的对象。在你的情况下,这里面的任何非静态方法或构造函数(如果你有一个,如果你使用"这个"在里面),那么"这个"指的是Sub类的特定实例。仅在创建对象时才适用。但是在类的静态上下文中的任何东西,你都可以在没有创建对象的情况下使用它,因为它在类加载期间被解析。 "这"仅在创建对象时解析(您甚至可以动态地说明哪个对象)。所以"这个"在静态环境中有意义。希望能帮助到你。上帝保佑。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我同意在我之前回复的所有其他人。让我以不同的方式尝试回答这个问题:

我想,实例方法/非静态方法属于一个类的实例(意味着迟早我们需要对象引用它来访问它)所以这个关键字在实例块或方法中是有意义的。但是,对类的任何成员的静态关键字被解释为对类的直接资产,如果存在对象,则该对象可以访问它。所以在静态上下文中,它不确定对象是否存在于某个地方。这就是为什么在java中不允许使用这个内部静态区域。

答案 8 :(得分:0)

当我们声明变量并且方法是静态的时候,这是在该关键字仅指向当前对象的对象之间共享。假设你已经创建了五个类foo的对象,那么只有一个由(int y)组成的副本被所有对象粉碎。如果你使用这个关键字访问int,那么编译器会得到一个歧义,该对象必须指向,因为static int y是共享的所有对象。您可以使用类名访问静态变量。

答案 9 :(得分:0)

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

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

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