【问题标题】:Fundamental misunderstanding of objects and attributes in JavaJava中对象和属性的基本误解
【发布时间】:2017-04-17 21:26:18
【问题描述】:

我正坐在大学的作业中,我担心我还没有真正理解 Java 或 OOP 概念中的一些基本知识。我会尽量缩短它(也许只看第三个代码段就足够了,但我只是想确保我包含了足够的细节)。我要写一点员工管理。该项目中的一个类是employeeManagement 本身,该类应该具有通过冒泡排序按首字母排序员工的方法。

我为此编写了 3 个类:第一个是“Employee”,它包含一个名称和一个 ID(一个流水号)、getter 和 setter 方法以及一个用于检查一个员工的第一个字母是否更小的方法(在字母表中较低)比另一个。它看起来像这样:

static boolean isSmaller(Employee source, Employee target) {
    char[] sourceArray = new char[source.name.length()];
    char[] targetArray = new char[target.name.length()];

    sourceArray = source.name.toCharArray();
    targetArray = target.name.toCharArray();

    if(sourceArray[0] < targetArray[0])
        return true;
    else 
        return false;
}

我测试了它,它似乎适用于我的情况。现在还有另一个名为 EmployeeList 的类,它通过一组员工(“员工”对象)管理员工。这个数组的大小是通过构造函数确定的。我的代码如下所示:

public class EmployeeList {
/*attributes*/
private int size;
private Employee[] employeeArray;

/* constructor */
public EmployeeList(int size) {
    this.employeeArray = new Employee[size];
}
 /* methods */
public int getSize() {
    return size;
}

public void setSize(int size) {
    this.size = size;
}
/* adds employee to end of the list. Returns false, if list is too small */
boolean add(Employee m) {
    int id = m.getID();
    if (id > employeeArray.length) {
        return false;
    } else {
        employeeArray[id] = m;
        return true;
    }

}
/* returns employee at certain position */
Employee get(int index) {
    return employeeArray[index];
}
/* Sets employee at certain position. Returns null, if position doesn't exist. Else returns old value. */
Employee set(int index, Employee m) {
    if (employeeArray[index] == null) {
        return null;
    } else {
        Employee before = employeeArray[index];
        employeeArray[index] = m;
        return before;
    }
}

现在我的真正问题来了:在名为“employeeManagement”的第三个类中,我应该实现排序算法。这个类看起来像这样:

public class EmployeeManagement {
private EmployeeList ml = new EmployeeList(3);

public boolean addEmployee(Employee e) {
    return ml.add(e);
}

public void sortEmployee() {
    System.out.println(ml.getSize()); // I wrote this for debugging, exactly here lies my problem
    for (int n = ml.getSize(); n > 1; n--) {
        for (int i = 0; i < n - 1; i++) {
            if (Employee.isSmaller(ml.get(i), ml.get(i + 1)) == false) {
                Employee old = ml.set(i, ml.get(i + 1));
                ml.set(i+1, old);
            }
        }
    }
}

我的评论之前的“println”在控制台中返回“0”......我期待“3”,因为这是我在“EmployeeManagement”类中将“EmployeeList”作为构造函数的参数提供的大小。我的错误在哪里?以及如何访问我在“EmployeeManagement”类(“3”)中创建的对象的大小?我真的很期待你的回答!

谢谢, 膈肌

【问题讨论】:

  • isSmaller 写成return source.name.charAt(0) &lt; target.name.charAt(0); 更容易(也更有效)。
  • ...但是您还会遇到名称以相同字符开头或长度为零的问题。有充分的理由不使用return source.name.compareTo(target.name);吗?
  • 就像 Elliott 的回答所说,问题可能与您对 OOP 的理解无关,但基于其他一些事情,我怀疑您确实存在一些误解。在isSmaller 中,您似乎认为您正在使用new char[source.name.length()] 为数组预先分配空间,但您不需要这样做,事实上该数组只是被丢弃了。 Java 中的char[] 实际上更像是其他一些语言中的指针。 toCharArray 已经在堆上分配了一个数组并返回对它的引用。参见例如stackoverflow.com/q/40480/2891664

标签: java oop object constructor


【解决方案1】:

存储 size 在你的构造函数中。类似的,

public EmployeeList(int size) {
    this.employeeArray = new Employee[size];
    this.size = size; // <-- add this.
}

另外,setSize 不会自动复制(和增长)数组。您将需要复制该数组,因为 Java 数组具有固定长度。最后,这里不需要size,因为employeeArray 有一个length

【讨论】:

  • (但是,为什么要存储size,而不仅仅是使用employeeArray.length
  • @AndyTurner 我正在回答 为什么 OP 的代码目前给出了 0
  • 当然,我不是在批评你的回答,我只是指出没有必要存储它,特别是如果你要扩大阵列。
  • 非常感谢您提供令人难以置信的快速解决方案!我的印象是 Employee[size] 会自动更改类的 size 属性,但现在我想到它当然是 bs。
【解决方案2】:

您调用的大小变量是类字段。如果您快速查看您的代码,getter 正在获取该字段(在创建时初始化为零)。您正在使用它的大小。这样做的好方法是像这样在 getter 中获取数组的大小:

public int getSize() {
   return employeeArray.length;
}

这将返回对象中数组的大小。

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2011-03-18
    • 2011-08-25
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多