我是一个初学者,自学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输出:非静态变量,不能引用静态上下文宿舍=新宿舍();
发布于 2021-08-20 01:56:07
造成此错误的原因是,Dormitory被定义为内部类 of Student。这意味着每个Dormitory都包含在Student中,需要使用包含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扩展StudentDormitory重命名为DormitoryAssignment,因为我认为这是对它包含的数据的更准确的描述(“宿舍”可能意味着整个建筑物)。main方法从Student移到一个单独的应用程序类中,该类名为整个程序要做的事情https://stackoverflow.com/questions/68828240
复制相似问题