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

Java 两个非静态变量无法从静态上下文错误引用此变量,java,Java,我现在正在编写这段代码,它总是在“教师x1=new Teacher();学生y1=new Student()”部分返回错误“非静态变量this不能从静态上下文引用”。我不知道该怎么做才能使程序正常工作。谢谢你的帮助 编辑:添加了其他类 编辑2:此代码的目标是拥有一个班级成员(姓名、年龄和性别)、另一个班级学生(成绩)和教师(薪水)。学生类和教师类必须继承自Person类 我的代码: import java.util.*; import java.util.Scanner; public cla

我现在正在编写这段代码,它总是在“教师x1=new Teacher();学生y1=new Student()”部分返回错误“非静态变量this不能从静态上下文引用”。我不知道该怎么做才能使程序正常工作。谢谢你的帮助

编辑:添加了其他类 编辑2:此代码的目标是拥有一个班级成员(姓名、年龄和性别)、另一个班级学生(成绩)和教师(薪水)。学生类和教师类必须继承自Person类

我的代码:

import java.util.*;
import java.util.Scanner;

public class Java2Technical {

public static void main(String[] args) {
System.out.println("DATABASE");
System.out.println(" ");
System.out.println("1. Teacher");
System.out.println("2. Student");
    
System.out.print("Choice: ");
Scanner scan = new Scanner(System.in);
int choice = scan.nextInt();   
System.out.println(" ");
    
if(choice == 1) {
    Teacher x1 = new Teacher();
    System.out.print("Name: ");
    Scanner scan1 = new Scanner(System.in);
    x1.name = scan1.nextLine();
    System.out.println(" ");
    
    System.out.print("Age: ");
    Scanner scan2 = new Scanner(System.in);
    x1.age = scan2.nextInt();
    System.out.println(" ");
    
    System.out.print("Gender: ");
    Scanner scan3 = new Scanner(System.in);
    x1.gen = scan3.next().charAt(0);
    System.out.println(" ");
    
    System.out.print("Salary: " + x1.salary);
    System.out.println(" ");
    }
    
    else if(choice == 2){
    Student y1 = new Student();
    
    System.out.print("Name: ");
    Scanner scan1 = new Scanner(System.in);
    y1.name = scan1.nextLine();
    System.out.println(" ");
    
    System.out.print("Age: ");
    Scanner scan2 = new Scanner(System.in);
    y1.age = scan2.nextInt();
    System.out.println(" ");
    
    System.out.print("Gender: ");
    Scanner scan3 = new Scanner(System.in);
    y1.gen = scan3.next().charAt(0);
    System.out.println(" ");
    
    System.out.print("Grade: " + y1.grade);
    System.out.println(" ");
    }
    else{
        System.out.println("Invalid Input");
    }
}
     public class Person {

     String name;
     int age;
     char gen;
     double grade;
    double salary;
 }

public class Student extends Person {
    public void setName(String Brand) {
        this.name = name;
   }
public void setAge(int age) {
    this.age = age;
}
public void setGen(char gend) {
    this.gen = gen;
}
public void setGrade(double grade){
    this.grade = grade;
}
public String getName(String name) {
    return this.name;
}
public int getAge(int age) {
    return this.age;    
}
public char getGen(char gend) {
    return this.gen;
}
public double getGrade(double grade) {
    return this.grade;
    }   
}
public class Teacher extends Person {
public void setName(String Brand) {
    this.name = name;
}
public void setAge(int age) {
    this.age = age;
}
public void setGen(char gen) {
    this.gen = gen;
}
public void setSalary(double salary) {
    this.salary = salary;
}
public String getName(String name) {
    return this.name;
}
 public int getAge(int age) {
    return this.age;
}
  public char getGen(char gen) {
    return this.gen;
}
  public double getSalary(double salary) {
    return this.salary;
    }  
}
}
您的主方法是静态的,因此您处于一个静态上下文中,
this
不存在

静态成员或静态方法与类关联,而不是与类的实例关联。每个类只存在一个静态成员,每个实例的非静态成员是唯一的

如果您有一个与示例中相同的内部类,那么只有在已经有外部类的实例时,才能创建内部类的实例

public class Outer {
    public class Inner {  }

    public static void main (String[] args) {
        var outer = new Outer();
        var inner = outer.new Inner(); // notice the use of the outer instance here
    }
}
如果您不希望将内部类的每个实例绑定到外部类的特定实例,并且希望能够独立地实例化它,则需要将内部类设置为静态:

注意内部类上的static关键字,它使得实例化外部类变得不必要


另外,当您已经在实例上下文中时,不需要显式使用外部类:

public class Outer {
    public class Inner {  }

    Inner inner;

    Outer() {
        var inner = new Inner(); // `this` exists, we are in an instance of the outer class and can thus instantiate the inner class because we are in the proper object context
        this.inner = inner;
    }

    public static void main (String[] args) {
        var outer = new Outer();
        var inner = outer.inner; // access the outer classes field and get the instance of the inenr class that was created in the constructor of the outer class
    }
}

还请注意,适当的缩进使代码更易于阅读。

什么是
教师
学生
课程?它们是内部类吗?@Ria你能不能也发布老师和学生的类?请把你的代码变成一个。此外,出于对所有好处的热爱,请格式化您的代码并使用某种形式的合理缩进。你的代码非常难读,而且很烦人。
public class Outer {
    public class Inner {  }

    Inner inner;

    Outer() {
        var inner = new Inner(); // `this` exists, we are in an instance of the outer class and can thus instantiate the inner class because we are in the proper object context
        this.inner = inner;
    }

    public static void main (String[] args) {
        var outer = new Outer();
        var inner = outer.inner; // access the outer classes field and get the instance of the inenr class that was created in the constructor of the outer class
    }
}