非静态变量这不能从静态上下文中引用.宿舍=新宿舍()



我是一个自学Java程序员的初学者。我正在努力完善我对OOPS的了解,在过去的几天里,我一直在努力通过这个修改器问题。

我需要有人仔细阅读并向我解释我做错了什么,以及我应该如何做对。

代码

class Student {
int studentId;
String firstName;
String lastName;
char gender;
int age;
String nationality;
Student(){
System.out.println("Student Record");
}
void setStudentDetails(int studentId, String firstName, String lastName, char gender, int age, String nationality){
this.studentId = studentId;
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
this.nationality = nationality;
}
void showStudentDetails(){
System.out.println("Student ID: " + studentId);
System.out.println("First Name: " + firstName);
System.out.println("Last Name: " + lastName);
System.out.println("Gender: " + gender);
System.out.println("Age : " + age);
System.out.println("Nationality: " + nationality);
}
class Contact extends Student {
String fullAddress;
String postalAddress;
long phoneNumber;
String email;
String nextOfKin;
String nextOfKinAddress;
long nextOfKinPhoneNumber;
void setStudentDetails(int studentId, String firstName, String lastName, char gender, int age, String nationality, String fullAddress, String postalAddress, long phoneNumber, String email, String nextOfKin, String nextOfKinAddress, long nextOfKinPhoneNumber){

this.studentId = studentId;
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
this.nationality = nationality;
this.fullAddress = fullAddress;
this.postalAddress = postalAddress;
this.phoneNumber = phoneNumber;
this.email = email;
this.nextOfKin = nextOfKin;
this.nextOfKinAddress = nextOfKinAddress;
this.nextOfKinPhoneNumber = nextOfKinPhoneNumber;
}
void showStudentDetails(){
System.out.println("Student ID: " + studentId);
System.out.println("First Name: " + firstName);
System.out.println("Last Name: " + lastName);
System.out.println("Gender: " + gender);
System.out.println("Age : " + age);
System.out.println("Nationality: " + nationality);
System.out.println("Full Address: " + fullAddress);
System.out.println("Postal Address: " + postalAddress);
System.out.println("Phone Number: " + phoneNumber);
System.out.println("Enail: " + email);
System.out.println("Next of Kin: " + nextOfKin);
System.out.println("Next of Kin Address: " + nextOfKinAddress);
System.out.println("Next of Kin Phone Number: " + nextOfKinPhoneNumber);
}
}
class Dormitory extends Student {
String hallName;
int dormFloor;
String dormWing;
int dormRoomNum;
int bunkNum;
void setStudentDetails(int studentId, String firstName, String lastName, char gender, int age, String nationality, String fullAddress, String postalAddress, long phoneNumber, String email, String nextOfKin, String nextOfKinAddress, long nextOfKinPhoneNumber, String hallName,int dormFloor,String dormWing,int dormRoomNum,int bunkNum){

this.studentId = studentId;
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
this.nationality = nationality;
this.hallName = hallName;
this.dormFloor = dormFloor;
this.dormWing = dormWing;
this.dormRoomNum = dormRoomNum;
this.bunkNum = bunkNum;
}
void showStudentDetails(){
System.out.println("Student ID: " + studentId);
System.out.println("First Name: " + firstName);
System.out.println("Last Name: " + lastName);
System.out.println("Gender: " + gender);
System.out.println("Age : " + age);
System.out.println("Nationality: " + nationality);
System.out.println("Dormitory: " + hallName);
System.out.println("Dormitory Floor: " + dormFloor);
System.out.println("Floor Wing: " + dormWing);
System.out.println("Room Number: " + dormRoomNum);
System.out.println("Bunk Number: " + bunkNum);
}
}
public static void main(String[] args){
Dormitory dormitory = new Dormitory();
dormitory.setStudentDetails(001,"David","Olawuyi",'M', 29, "Nigerian","2 Glover Road, Lagos", "Same as Full Address", 9045356445L,"lol@yahoo.com","Philip Olawuyi","2 Glover Road, Lagos",8074637483L,"King Hall",2,"D",35,3);
dormitory.showStudentDetails();
}
}

JVM输出:不能从静态上下文引用的非静态变量宿舍宿舍=新建宿舍();

此错误的原因是Dormitory被定义为Student的内部类。这意味着每个Dormitory都包含在Student中,并且需要使用包含的Student来创建。

此代码编译:

Dormitory dormitory = new Student().new Dormitory();

然而,这可能不是你想要设计这个程序的方式。从逻辑上讲,宿舍不包含学生。您也不希望将Student创建为Dormitory的内部类。尽管你可能会考虑宿舍容纳学生,但在Java中,你不能将内部类的实例重新分配给外部类的不同实例,所以最好将它们定义为单独的顶级类。与Contact相同。或者,您可以将它们定义为静态嵌套类,但我建议从顶级类开始。

在这段代码中Dormitory也是extends Student,这不是设计面向对象程序的常用方法。继承是指对";is-a";关系,所以在Java中说class Dormitory extends Student就像说";宿舍就是学生;用英语更有可能的是,你会说";宿舍有一个学生";(或者可能不止一个)。您可以通过给Dormitory一个类型为Student的字段并将其分配给占用床铺的学生来表示:

class Dormitory {
String hallName;
int dormFloor;
String dormWing;
int dormRoomNum;
int bunkNum;
Student occupant; // Added field
void setDormitoryDetails(String hallName, int dormFloor, String dormWing, int dormRoomNum, int bunkNum, Student occupant) {
this.hallName = hallName;
this.dormFloor = dormFloor;
this.dormWing = dormWing;
this.dormRoomNum = dormRoomNum;
this.bunkNum = bunkNum;
this.occupant = occupant;
}
void showStudentDetails() {
System.out.println("Student ID: " + occupant.studentId);
System.out.println("First Name: " + occupant.firstName);
System.out.println("Last Name: " + occupant.lastName);
System.out.println("Gender: " + occupant.gender);
System.out.println("Age : " + occupant.age);
System.out.println("Nationality: " + occupant.nationality);
System.out.println("Dormitory: " + hallName);
System.out.println("Dormitory Floor: " + dormFloor);
System.out.println("Floor Wing: " + dormWing);
System.out.println("Room Number: " + dormRoomNum);
System.out.println("Bunk Number: " + bunkNum);
}
}

这可以从main中使用,如下所示:

public static void main(String[] args) {
Dormitory dormitory = new Dormitory();
Contact student = new Contact();
student.setStudentDetails(001,"David","Olawuyi",'M', 29, "Nigerian","2 Glover Road, Lagos", "Same as Full Address", 9045356445L,"lol@yahoo.com","Philip Olawuyi","2 Glover Road, Lagos",8074637483L);
dormitory.setDormitoryDetails("King Hall", 2, "D", 35, 3, student);
dormitory.showStudentDetails();
}

如果这是我的程序,我会做一些其他的改变:

  • 让每个类接受字段作为构造函数参数,而不是一个大集合方法
  • 使每个字段为private,并添加getter方法
  • Contact重命名为ContactDetails,并使每个学生都有一个ContactDetails字段,而不是由Contact扩展Student
  • Dormitory重命名为DormitoryAssignment,因为我认为这更准确地描述了它包含的数据("宿舍"可以指整个建筑)
  • main方法从Student移到一个单独的应用程序类中,该应用程序类根据整个程序的意图命名

最新更新