首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非静态变量这不能引用从静态上下文宿舍宿舍=新宿舍();

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

Stack Overflow用户
提问于 2021-08-18 07:35:54
回答 1查看 46关注 0票数 0

我是一个初学者,自学Java程序员。我正在努力完善我对OOPS的认识,在过去的几天里,我一直在试图通过这个修饰语问题。

拜托,我需要有人细读,向我解释我做错了什么,我应该怎样做才对。

代码语言:javascript
复制
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输出:非静态变量,不能引用静态上下文宿舍=新宿舍();

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-20 01:56:07

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

该代码编译:

代码语言:javascript
复制
Dormitory dormitory = new Student().new Dormitory();

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

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

代码语言:javascript
复制
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中使用:

代码语言:javascript
复制
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移到一个单独的应用程序类中,该类名为整个程序要做的事情
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68828240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档