无法静态引用非静态方法或者字段

时间:2020-01-09 10:34:50  来源:igfitidea点击:

这篇文章显示了"无法静态引用非静态方法或者非静态字段"错误的含义以及如何解决该错误。
“Cannot make a static reference to the non-static method or a non-static field”

静态引用非静态字段或者方法错误

为了了解为什么会出现此错误,我们必须了解实例成员(字段和方法)与类成员之间的区别。

实例成员-这些成员,即实例字段和实例方法属于类的实例(对象)。我们只能通过类的一个对象来调用实例方法和访问实例变量,并且该类的每个对象都有其自己的实例成员的单独副本。

类成员(静态成员)–类的静态成员与该类相关联,这意味着不会为该类的每个对象创建声明为静态的字段和方法的单独副本。我们只能从静态上下文访问静态成员。

所以我们在这里看到问题了吗?我们甚至可以不创建类的任何对象而访问静态方法,但是尝试从该静态方法访问非静态方法带来了难题。该非静态方法属于哪个实例,所以甚至不会创建该类的任何实例。这就是为什么我们会收到此错误"无法静态引用非静态方法或者非静态字段"的原因。

例如,考虑以下类,我们试图在其中尝试从静态main方法调用非静态方法instanceMethod(),并尝试访问非静态字段i。

public class StaticDemo {
  int i = 0;
  public static void main(String[] args) {
    System.out.println("in main method which is static");
    // Trying to access non-static field
    i = 5;
    // Trying to access non-static method
    instanceMethod();
  }

  public void instanceMethod(){
    System.out.println("Value of i- " + i);
  }
}

代码给出了两个非静态成员的编译时错误。

Cannot make a static reference to the non-static field i
Cannot make a static reference to the non-static method instanceMethod()

将静态引用固定为非静态方法或者字段错误

正如我们现在必须知道的那样,我们需要一个对象来访问类的实例成员,因此创建一个对象并使用该对象来访问非静态字段。

public class StaticDemo {
  int i = 0;
  public static void main(String[] args) {
    System.out.println("in main method which is static");
    StaticDemo obj = new StaticDemo();
    obj.i = 5;
    obj.instanceMethod();
  }

  public void instanceMethod(){
    System.out.println("Value of i- " + i);
  }
}

输出:

in main method which is static
Value of i- 5