当前位置: 首页 > 知识库问答 >
问题:

两个非静态变量这不能从静态上下文错误中引用

堵毅然
2023-03-14

我现在正在编写这段代码,它总是在“教师x1=new Teacher();学生y1=new Student()”部分返回错误“非静态变量this cannot reference from a static context”。我不知道该怎么做才能让这个项目运转起来。谢谢你的帮助!

编辑:添加了其他类编辑2:此代码的目标是有一个类Person(带有姓名,年龄和性别),另一个类学生(带有等级)和教师(带有工资)。学生和教师类必须从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;
    }  
}
}

共有1个答案

应和光
2023-03-14

您的主要方法是静态的,因此您处于一个静态上下文中,这个不存在。

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

如果您有一个内部类,就像您在示例中所做的那样,那么只有当您已经有一个外部类的实例时,才能创建内部类的实例。

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
    }
}

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

 类似资料:
  • 问题内容: 以下代码在变量上产生了错误,con2说 我用Google搜索解决方案,并且他们暗示尚未初始化该变量以使方法可用。我初始化不正确吗?我也尝试过将事情改为公开,但这也无济于事。 问题答案: 不,实际上,你必须声明con2字段为静态: 编辑:更正,实际上是远远不够的,你将遇到相同的问题,因为getConnection2Url方法也不是静态的。更好的解决方案可能是改为进行以下更改:

  • 我是Android编码的n00b,今天我想尝试使用定位服务。 我设置了一个简单的类和一个简单的main,只是为了得到经度和纬度。 但当我尝试调用retrive的构造时,long and latitude Android Studio弹出了一个错误: 错误:(33,16)错误:无法从静态上下文引用非静态变量纬度 这是我的位置班

  • 我编写了以下测试代码: 但会出现以下错误: 我如何让我的方法识别我的类变量?

  • 问题内容: 我是Java新手,我正在尝试通过递归函数部署斐波那契跟踪,然后计算运行时间。这是我设法编写的代码: 问题是,当我尝试将其转换为字节码时,出现以下错误: 我想知道是什么问题?! 问题答案: 更改 至 并使该方法静态。 或者,改变 至

  • 错误来自此行板状态 addme = 新板状态(); 由于某种原因,它所指向的非静态变量是“新”的。我不清楚如何修复这个错误,因为new不应该是一个变量,也不是。 查看stackoverflow记录,该错误通常来自非静态方法,通常通过将该方法设为静态或完全绕过该方法来解决。T 下面的代码是为了引用这个语句前后发生的事情。 }……

  • 我有错误java:non-static variable在编译行Man m1=new Man(“a1”,“b1”,11)中的代码时,这不能从静态上下文引用;怎么解决? }