实例化Student/Teacher对象时触发non-static variable this静态上下文引用错误
问题原因与解决方案
错误根源
你代码里的Student和Teacher是非静态内部类,这类内部类的对象必须依附于外部类Person的实例才能创建。但main是静态方法,属于类本身,没有关联的外部类实例,所以直接new Student(...)会报错。
另外,非静态内部类的构造方法里直接给外部类的personName赋值,这种写法依赖隐含的Person.this外部类实例引用,在静态方法里这个引用不存在,也会导致问题。
至于移除main的static后错误消失,是因为非静态方法属于对象,此时方法内部隐含了当前Person实例的引用,能创建非静态内部类对象,但JVM要求程序入口main必须是静态方法,所以此时找不到运行入口。
解决方案
方案1:将内部类改为静态内部类
给Student和Teacher加上static修饰,成为静态内部类,这样它们不依赖外部类实例,静态方法里可直接创建对象。同时静态内部类无法访问外部类非静态成员,需要自己维护属性:
public class Person { String personName = ""; String personAddress = ""; public Person(String name, String address) { personName = name; personAddress = address; } // 改为静态内部类 static class Student { String studentName; String studentAddress; int numCourses = 0; String[] courses = new String[10]; int[] grades = new int[10]; Student(String name, String address) { this.studentName = name; this.studentAddress = address; } } // 改为静态内部类 static class Teacher { String teacherName; String teacherAddress; int numCourses = 0; String[] courses = new String[20]; public Teacher(String name, String address) { this.teacherName = name; this.teacherAddress = address; } } public static void main(String[] args) { Student student1 = new Student("Aaron", "1234 this road S"); Teacher teacher1 = new Teacher("Fatima", "1111 some road N"); } }
方案2:改用继承结构(更符合业务逻辑)
从设计角度看,Student和Teacher应该是Person的子类,用继承替代内部类更合理:
public class Person { String personName; String personAddress; public Person(String name, String address) { this.personName = name; this.personAddress = address; } public static void main(String[] args) { Student student1 = new Student("Aaron", "1234 this road S"); Teacher teacher1 = new Teacher("Fatima", "1111 some road N"); } } class Student extends Person { int numCourses = 0; String[] courses = new String[10]; int[] grades = new int[10]; public Student(String name, String address) { // 调用父类构造方法初始化姓名地址 super(name, address); } } class Teacher extends Person { int numCourses = 0; String[] courses = new String[20]; public Teacher(String name, String address) { super(name, address); } }
内容的提问来源于stack exchange,提问作者Frankenbtiz
相关产品推荐
相关产品推荐

