【问题标题】:Proper way to create classes and Objects [duplicate]创建类和对象的正确方法[重复]
【发布时间】:2021-06-24 13:15:03
【问题描述】:

目前我有这样的代码 School 数组代表学校,数组中的每个元素代表一个教室 目前我想将班级教师姓名存储在数组中,如果尚未分配班级教师,则该特定数组元素为“空”

import java.util.*;
public class Main
{
    public static void main(String[] args) {
        String[] school = new String[8];
        initialise(school);
    }
    
    private static void initialise( String schoolRef[] ) {
        for (int x = 0; x < schoolRef.length; x++ ) schoolRef[x] = "empty";
        System.out.println(Arrays.toString(schoolRef));
    }
}

这个输出是

[empty, empty, empty, empty, empty, empty, empty, empty]

但是现在我想创建一个名为 School 的班级和一个名为 Classroom 的班级 我想使用 Classroom 对象数组

School.java

import java.util.Arrays;

public class School {

    private Room[] rooms;

    public static void initialise(Room[] schoolRef) {
        for (int x = 0; x < schoolRef.length; x++) {
            schoolRef[x].setName("empty");
            System.out.println(Arrays.toString(schoolRef));
        }
    }
}

Room.java

public class Room {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;



}

Main.java

public class Main {

    public static void main(String[] args) {

        Room[] rooms = new Room[8];
        School.initialise(rooms);
    }
}

但是,当我运行 Main 方法时,我得到了 NullPointerException。 我想创建一组 Classroom 对象,而不是在一个 Class 中编写所有内容,而且我不确定自己的方法做错了什么。 感谢任何帮助。谢谢

【问题讨论】:

  • 你得到的是空指针,因为 schoolRef[x] 为空

标签: java arrays class object


【解决方案1】:

如果您希望存在 50 个独特的房间,代码 new Room() 将不得不运行 50 次,无论以何种方式。 Room[] r = new Room[50]; 只创建了 50 个插槽,您可以在其中写入房间的位置,它不会创建任何房间。 new Room() 会创建一个房间,其他都不会。

for (int i = 0; i < rooms.length; i++) {
    rooms[i] = new Room();
}

现在您创建 50 个新房间并将它们分配到您的“房间位置列表”中的一个位置。

记住,所有 java 类型,除了原语,是引用、指针、藏宝图(而不是宝藏)、房间的位置(而不是房间)等等——无论哪种思维方式更容易你。

因为您没有在示例中创建房间,例如room[5] 是一个空指针(room[5] 可以保存房间的位置,但是当您运行该代码时,会出现一个空白区域,因此,当您要求某人'走到这里写下的房间并写下empty 在您在里面找到的黑板上',如果您指向通常会写入位置的空白区域,他们甚至不会知道这意味着什么。在 java-ese 中:发生 NullPointerException。

【讨论】:

    【解决方案2】:

    这个Room[] rooms = new Room[8]; 只是创建了一个Room 类型的数组。它不会创建包含 8 个Room 对象的数组。此外,School 中的房间数组也没有被使用。因此,不要使用静态方法,而是使用构造函数初始化 School 对象中的房间数组。

    您需要将School 类更新为:

    public class School {
    
        private Room[] rooms;
    
        public School(int length) {
            rooms = new Room[length];
            for (int x = 0; x < length; x++) {
                Room r = new Room(); // create a room object and add to array.
                r.setName("empty");
                rooms[x] = r;
            }
            System.out.println(Arrays.toString(rooms));
        }
    }
    

    并在main 方法中创建一个School 对象:School s = new School(8)

    【讨论】:

      【解决方案3】:

      创建这样的结构。根据需要修改代码。

      public class Test {
      
              public static void main(String[] args) throws Exception {
                  Teacher t1 = new Teacher("John");
                  Classroom cr = new Classroom("5thA");
                  cr.setTeacher(t1);
                  School school = new School("ABC School");
                  school.addClassRoom(cr);
          
                  System.out.println(school.getClassRooms());
              }
          }
          
          class Teacher {
              private String name;
              public Teacher(String name) {
                  this.name = name;
              }
              
              @Override
              public String toString() {
                  return this.name;
              }
          }
          
          class Classroom {
              private String name;
              private Teacher teacher;
              public Classroom(String no) {
                  this.name = no;
              }
              
              public void setTeacher(Teacher teacher) {
                  this.teacher = teacher;
              }
              
              public Teacher getTeacher() {
                  return this.teacher;
              }
              
              @Override
              public String toString() {
                  return this.name;
              }
          }
          
          class School {
              String name;
              List<Classroom> classRooms = new ArrayList<>();
              
              public School(String name) {
                  this.name = name;
              }
              
              public String getName() {
                  return this.name;
              }
              
              public void addClassRoom(Classroom cr) {
                  classRooms.add(cr);
              }
              //write methods for remove class room
              
              public List<Classroom> getClassRooms(){
                  return this.classRooms;
              }
              
              @Override
              public String toString() {
                  return this.name;
              }
          }
      

      注意:将这些类放在单独的文件中。

      【讨论】:

        【解决方案4】:

        我可以在您的代码中看到 3 个问题。

        1. 你已经创建了数组 if School 并且没有初始化对象。在schoolRef[x].setName("empty"); 行前添加schoolRef[x] = new Room();

        2. 调用 Arrays.toString(schoolRef) 将期望 Object 的 toString 方法在您的 Room 类中被覆盖。否则它将打印对象的引用而不是实际值。下面添加到房间类 public String toString() { return " " + name; }

        3. 写出System.out.println(Arrays.toString(schoolRef));

        【讨论】:

          【解决方案5】:

          方法initialise:

          public static void initialise(Room[] schoolRef) {
              for (int x = 0; x < schoolRef.length; x++) {
                  schoolRef[x] = new Room();
                  schoolRef[x].setName("empty");
                  System.out.println(Arrays.toString(schoolRef));
              }
          }
          

          String 确实需要实例化(新对象)。因为 java 做到了。但是如果你想使用一个对象,你应该先新建一个对象。

          【讨论】:

            猜你喜欢
            • 2017-11-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-09
            • 2015-11-15
            • 2020-04-01
            • 1970-01-01
            • 2011-10-22
            • 1970-01-01
            相关资源
            最近更新 更多