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

来自静态上下文的非静态变量引用(Java),java,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 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();
  }
}
但它总是给我一个错误:

错误:非静态变量无法从静态上下文引用此变量

    Student s = new Student();
我一直都是这样声明对象的!我不知道今天发生了什么


我需要了解我做错了什么?

让你的个人和学生课堂保持静止

首先创建测试对象以在main方法中创建学生对象

学生s=新测试。新学生


原因:由于Person/Student类是非静态的,没有测试对象它们就不可能存在。所以这些类应该是静态的,或者应该首先创建Test来创建Student。

使您的Person和Student类保持静态

首先创建测试对象以在main方法中创建学生对象

学生s=新测试。新学生


原因:由于Person/Student类是非静态的,没有测试对象它们就不可能存在。因此,这些类应该是静态的,或者应该首先创建Test来创建Student。

从测试类中删除person和Student:

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 class Test{ 
    public static void main(String args[]) { 
        Student s = new Student();    
        s.display(); 
    }
 }

从测试类中删除个人和学生:

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 class Test{ 
    public static void main(String args[]) { 
        Student s = new Student();    
        s.display(); 
    }
 }
这一切都很好:

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

     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 class Test {


        public static void main(String args[]) {
            Student s = new Student();
            s.display();
        }
    }
这一切都很好:

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

     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 class Test {


        public static void main(String args[]) {
            Student s = new Student();
            s.display();
        }
    }

声明内部类时:

class Outer {
  class Inner {
  }

  void doSomething() {}
}
存在对外部类的实例的隐式引用,外部类的实例由内部类的每个实例持有。这意味着您可以在内部类中编写以下内容来引用外部实例:

Outer.this.doSomething();
实际上,您通常可以简单地编写doSomething—您只需要外部。如果内部类也有一个名为doSomething的方法,那么您需要消除歧义

这其中的长短不一之处在于,您实际上需要外部实例来创建内部实例:

如果您实际上不需要引用外部-内部-内部的实例,例如,您永远不需要调用doSomething,最简单的解决方案就是将内部类设置为静态:


事实上,我建议您始终将内部类设置为静态,除非您确实需要它们是非静态的。

当您声明内部类时:

class Outer {
  class Inner {
  }

  void doSomething() {}
}
存在对外部类的实例的隐式引用,外部类的实例由内部类的每个实例持有。这意味着您可以在内部类中编写以下内容来引用外部实例:

Outer.this.doSomething();
实际上,您通常可以简单地编写doSomething—您只需要外部。如果内部类也有一个名为doSomething的方法,那么您需要消除歧义

这其中的长短不一之处在于,您实际上需要外部实例来创建内部实例:

如果您实际上不需要引用外部-内部-内部的实例,例如,您永远不需要调用doSomething,最简单的解决方案就是将内部类设置为静态:


事实上,我建议您始终将内部类设置为静态,除非您确实需要它们是非静态的。

除了main方法之外,似乎并没有静态方法,也并没有使用this关键字。你确定你发布了正确的代码吗?它抱怨变量“this”,而你没有,你也没有使用关键字this,因此,请确保你的文件已保存,然后再试一次是的,我是。我不知道我做错了什么我将创建一个新的项目文件,并尝试复制其中的代码。除了main方法之外,这里似乎并没有静态方法,也并没有this关键字的用法。你确定你发布了正确的代码吗?它抱怨变量“this”,而你没有,你也没有使用关键字this,因此,请确保你的文件已保存,然后再试一次是的,我是。我不知道我做错了什么演示你编译并运行这个程序吗?我将创建一个新的项目文件并尝试复制那里的代码。我不明白你所说的测试对象是什么意思。是的,我现在知道了。但是分离文件更容易。谢谢我不明白你说的测试对象是什么意思?是的,我现在知道了。但是分离文件更容易。感谢回答@AndyInner-inner=new-Outer.new-inner;清除所有内容,为了拥有内部类的实例,您需要外部类的实例Perfect answer@AndyInner inner=new outer.new inner;清除所有内容,为了拥有内部类的实例,您需要外部类的实例