【问题标题】:two non-static variable this cannot be referenced from a static context error两个非静态变量 this 不能从静态上下文错误中引用
【发布时间】:2021-02-10 08:49:02
【问题描述】:

我现在正在执行此代码,它总是在“教师 x1 = new Teacher(); and Student y1 = new Student( )”。我对我应该怎么做才能使程序正常工作感到困惑。感谢您的帮助!

编辑:添加了其他类 编辑 2:此代码的目标是有一个班级 Person(有姓名、年龄和性别)、另一个班级 Student(有成绩)和教师(有薪水)。 Student 和 Teacher 类必须继承自 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;
    }  
}
}

【问题讨论】:

  • 什么是TeacherStudent 类?它们是内部类吗?
  • @Ria 你能把教师和学生的课程也发一下吗?
  • 请将您的代码设为minimal reproducible example。另外,出于对所有美好事物的热爱,请格式化您的代码并使用某种形式的合理缩进。您的代码非常难以阅读且令人讨厌。

标签: java


【解决方案1】:

你的主要方法是静态,所以你在一个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
    }
}

如果您希望将内部类的每个实例绑定到外部类的特定实例,并且希望能够独立实例化它,则需要使内部类静态:

public class Outer {
    public static class Inner {  }

    public static void main (String[] args) {
        var inner = new Inner(); // works now
    }
}

注意内部类的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
    }
}

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

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2011-11-30
    相关资源
    最近更新 更多