来自静态上下文的非静态变量引用(Java)

Sai*_*ran 1 java

我已经搜索过这个问题,但仍然没有得到任何解决方案.

我宣布了这个简单的程序:

public class Test{
  public abstract class Person {
      public void talk(){
        System.out.print("I am a person");
      }
      public abstract void display();
  }

  public class Student extends Person {
    public void talk(){
        System.out.println("I am a student");
    }

    public void display(){
        System.out.println("Nice to meet you");
        super.talk();
    }
  }

  public static void main(String args[])
  {
    Student s = new Student();
    s.display();
  }
}
Run Code Online (Sandbox Code Playgroud)

但它一直给我错误:

错误:非静态变量,不能从静态上下文引用

    Student s = new Student();
Run Code Online (Sandbox Code Playgroud)

我一直在这样声明对象!我不知道今天发生了什么.

我需要了解我在这里做错了什么?

And*_*ner 7

声明内部类时:

class Outer {
  class Inner {
  }

  void doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)

存在对Outer每个实例所持有的类的实例的隐式引用Inner.这意味着您可以在内部类中编写以下内容以引用外部实例:

Outer.this.doSomething();
Run Code Online (Sandbox Code Playgroud)

实际上,你通常可以简单地写doSomething()- 你只需要Outer.this内部类也有一个被调用的方法doSomething(),你需要消除歧义.

这个的长短是你实际上需要一个实例Outer来创建一个实例Inner:

Outer outer = new Outer();
Inner inner = outer.new Inner();
Run Code Online (Sandbox Code Playgroud)

如果你实际上不需要引用Outer内部实例Inner(例如你永远不需要调用doSomething()),最简单的解决方案就是创建内部类static:

class Outer {
  static class Inner {}

  void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

事实上,我建议你总是让内部类静态,除非你真的需要它们是非静态的.