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

问题描述 投票:0回答:10
class Sub {
    static int y;
    public static void foo() {
         this.y = 10;
    }
}

我理解

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

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

这个额外限制的目的是什么?

java oop static this
10个回答
99
投票

因为

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

7
投票

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

this :- “this”表示当前类 OBJECT ,因此很明显“this”只出现 一旦我们打算创建该类的对象,就会看到这张图片。

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

所以如果我们同时使用两者(static 和 this)就会产生矛盾。 这就是我们不能在静态方法中使用“this”的原因。


6
投票

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


2
投票

为了让你的代码正常工作,请像这样编写:

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

您可以在静态方法中设置静态字段,但您无法在静态方法中访问

this
,因为
this
代表对象的当前实例,而在静态方法中您没有实例。


2
投票

这意味着“这个”对象,但实际上并不存在。在您的情况下,您可以按照 @tibtof 建议使用类名。


1
投票

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


1
投票

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

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

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


0
投票

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


0
投票

当我们声明变量和方法是静态的时,this 是在对象之间共享的,其中 this 关键字仅指向当前对象。假设您创建了 foo 类的五个对象,然后只有一个由 (int y) 组成的副本被所有对象粉碎。因此,如果您使用此关键字访问 int y,则编译器会得到一个模糊性,因为 static int y 是共享的,所以编译器必须指向哪个对象由所有对象。您可以使用类名访问静态变量。


0
投票

让我们通过一个简单的例子来理解

示例1

public class Sample{
   static int num = 50;
   public static void demo(){
      System.out.println("Contents of the static method");
   }
   public static void main(String args[]){
      Sample.demo();
   }
}

输出

Contents of the static method

示例2

public class Sample{
   static int num = 50;
   public static void demo(){
      System.out.println("Contents of the static method"+this.num);
   }
   public static void main(String args[]){
      Sample.demo();
   }
}

输出

error: non-static variable this cannot be referenced from a static context

总结 明智地观察示例2,您就会知道您将获得CTE。这两个例子将帮助您理解差异

不断学习,不断成长

© www.soinside.com 2019 - 2024. All rights reserved.