【问题标题】:I need some help designing an array我需要一些帮助来设计一个数组
【发布时间】:2012-03-29 01:43:37
【问题描述】:

对于我的家庭作业,我们的任务是创建:

Person 具有变量 firstName, lastName, streetAddress, zipCodephone 的类。

CollegeEmployee 扩展 Person 并添加 ssn, salary,deptName

Faculty 通过添加布尔值tenure 扩展CollegeEmployee

最后但同样重要的是,Student 通过添加 GPAmajor 扩展了 person

在屏幕上显示一切看起来都不错,我将继续进行下一部分的任务,即在一个数组中创建 14 条记录(7 名学生、4 名员工和 3 名教职员工)。

3 个不同的类,具有多种数据类型,我终生无法弄清楚如何用它填充数组。这是我创建的第一个不是完全整数的数组。 Java 教程没有给我任何东西,虽然Java: Generic Static Multidimensional Arrays 有一些很棒的信息,但我现在无法理解。

我最初想创建array[14][10]——14 个变量,每个变量对应10 个对象——但我不能混合数据类型。那是我迷路的地方。

任何人对如何设计这个数组以及之后能够显示其中的值有什么建议吗?

任何提示和建议将不胜感激!

谢谢。

【问题讨论】:

  • 您需要重新审视 OOP 基础知识。你所有的对象都是Persons
  • 教员大学雇员?不是在现实中;)
  • @Andreas_D - 我认为您需要查找“教师”。我不认为街上的人会走进来教课;)
  • OK:en.wiktionary.org/wiki/faculty - 就我和维基词典的理解而言,教师是职员或部门。一个人(大学雇员)可以是教员的成员。但多年来的含义可能已经改变;)
  • 很公平,但在他使用它的上下文中(使用tenure)我认为他的意思很明显;)也许FacultyMember 代替了类名。当我想到“教师”时,我会想到老师而不是团队,所以如果我不考虑的话,我很容易在命名方面做出同样的飞跃。

标签: java arrays multidimensional-array


【解决方案1】:

据我了解,多维数组没必要看中。

1) 创建一个包含Person 实例的数组。

Person [] myPeeps = new Person[14];

2) 在Person 上创建一个print 方法,子类覆盖该方法以打印相关信息。

因为您的数组需要Person 实例,所以您可以放置​​Person 的任何子类的实例,因为子类与其超类始终具有is-a 关系。

因为 Person 有一个 print 方法,所以您可以对从数组中拉出的任何内容调用 print。子类提供它们自己的实现,因此它们可以打印它们的相关数据。这样,您就不会真正关心任何特定实例是哪个子类;在运行时调用实例的正确 print 实现。

【讨论】:

  • +1 表示print 方法,而不是覆盖toString,它应该仅用于调试目的。
【解决方案2】:

您不需要多维数组。您可以创建一个 Person 对象数组。

Person[] people = new Person[14];
people[0] = new Student();
people[1] = new Employee();
.
.
.

【讨论】:

    【解决方案3】:

    您也可以创建Person[] 数组,就像创建int[] 数组一样。例如

    Person[] people = new Person[14]
    

    然后您可以像这样将人员添加到数组中:

    people[0] = new Student();
    people[1] = new CollegeEmployee();
    people[2] = new Faculty();
    

    如果您想检查每个索引中的人员类型,您需要使用instanceof。尝试查看here 以获得更多帮助

    使用instanceof 的一个例子是:

    if(people[0] instanceof Student){
        System.out.println("This person is a student");
    }
    

    或者尝试使用泛型。

    您可以创建一个ArrayList<Person>,然后可以将任何类型的人添加到此 ArrayList。

    例如

    ArrayList<Person> peopleList = new ArrayList<Person>();
    //People can be added like this
    peopleList.add(new Student());
    peopleList.add(new CollegeEmployee();)
    

    再次,您可以使用instanceof 检查每个索引中的人员类型!

    如果你从不写

    Person person1 = new Person(); 
    

    然后在您的代码中考虑使您的类抽象。

    【讨论】:

      【解决方案4】:

      开始:

      Person[] myArray = new Person[14];

      【讨论】:

        【解决方案5】:

        这就是为什么面向对象编程如此美妙的原因。如果您注意到,所有FacultyCollegeEmployeeStudent 都是Person 类型的子集。因此,如果声明为 Person 类型,您可以将它们全部包含在同一个数据集中。

        Person[] array = new Person[14];
        

        您可以将所有对象添加到该数组中;但是,要小心。当你去使用数组的元素时,Java 现在只知道每个元素都有 Person 所做的方法 - 所以你只能使用 firstNamelastNamestreetAddresszipCode、和 phone 来自这些元素,除非您在检索到对象后对其进行强制转换。

        【讨论】:

          【解决方案6】:

          既然它们都是Person 类型,为什么不使用Person 数组呢?

          Person [] people = new Person[14];
          

          您可以安全地将所有类型的Person 添加到此数组中,但是您只能将它们视为Person(不进行强制转换)。让每个子类输出自定义细节,并在Person中添加此方法

          class Person {
              void print() {
                  // default Person printing
              }
          }
          

          并在每个子类中重写此方法以打印其成员变量:

          class Student extends Person {
              void print() { // <-- note same method signature!
                 // print "I'm a Student", GPA, major
              }        
          }
          

          当数组被填充时:

          for (Person p : people) {
              p.print(); // delegates to print method associated with the underlying type
          }
          

          【讨论】:

            【解决方案7】:

            Person 类是要存储在数组中的所有对象类型的通用超类。您可以基于该通用超类型创建数组。然后,您可以访问在该数组的所有元素上定义的方法,而不管实际类型如何——行为与实际类型中定义的一样(如果不清楚,请查找 java 的继承)。

            如果需要基于实际类型的特定行为,则需要将数组元素强制转换为具体类型(例如,可以使用instanceof 确定)

            【讨论】:

              猜你喜欢
              • 2011-08-24
              • 2012-01-05
              • 2015-12-21
              • 2018-12-07
              • 1970-01-01
              • 1970-01-01
              • 2020-08-06
              • 2018-12-18
              • 1970-01-01
              相关资源
              最近更新 更多