【问题标题】:Java three classes hierarchy [duplicate]Java三类层次结构[重复]
【发布时间】:2016-11-13 11:37:49
【问题描述】:

我一直在阅读 Robert Lafore 的 Java 算法书籍。还有一个问题——对象排序。所以有三个类构成层次结构。在书中它工作正常,但在 Eclipse 中我有问题“隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数”。 我应该如何处理扩展类,或者我应该改变什么来使这段代码运行?请帮忙。谢谢。

class Person {
    private String lastName;
    private String firstName;
    private int age;

    public Person(String last, String first, int a) {
        lastName = last;
        firstName = first;
        age = a;
    } 

    public void displayPerson() {
        System.out.print("Last name: " + lastName);
        System.out.print(". First name: " + firstName);
        System.out.println(". Age: " + age);
    }

    public String getLast() {
        return lastName;
    }
}

下一个类扩展人。

public class ArrayInObj extends Person  {

    private Person a[];
    private int nElems;

    public ArrayInObj(int max) {        // Here is the problem
        a = new Person[max];
        nElems = 0;
    }

    public void insert(String last, String first, int age) {
        a[nElems] = new Person(last, first, age);
    }

    public void display() {
        for (int i = 0; i < nElems; i++) {
            a[i].displayPerson();
        }
        System.out.println(" ");
    }

    public void insertionSort( ) {
        int in, out;

        for (out = 1; out < nElems; out++) {
            Person temp = a[out];
            in = out;

            while (in > 0 && a[in-1].getLast().compareTo(temp.getLast()) > 0) {
                a[in] = a[in -1];
                --in;
            }
            a[in] = temp;
        }
    }
}

以及具有main函数的主类。

public class ObjectSort extends ArrayInObj {

    public ObjectSort(int max) {
        super(max);
    }

    public static void main(String[] args) {

        int maxSize = 10;
        ArrayInObj arr = new ArrayInObj(maxSize);

        arr.insert("Evans", "Patty", 24);
        arr.insert("Smith", "Lorainne", 37);
        arr.insert("Yee", "Tom", 43);
        arr.insert("Adams", "Henry", 63);
        arr.insert("Hashimoto", "Sato", 21);

        System.out.println("Before sorting: ");
        arr.display();

        arr.insertionSort();

        System.out.println("After sorting: ");
        arr.display();

    }

}

【问题讨论】:

  • 在 Person 调用中定义无参数构造函数,例如 public Person(){} 我会质疑 ArrayObj 真的是一个人吗?
  • 您有一个类ArrayInObj,它用作Person 的多个实例的容器。因此,它不应扩展Person。删除继承(通过删除extends Person),您不必再担心该错误。
  • @f1sh,+1。该问题是继承滥用的典型示例。可能在这里使用List&lt;Person&gt; 就足够了。如果作者需要一个人员树(每个人都需要有相关人员的列表),则应该通过实现与类型无关的通用数据结构(如MyTree&lt;T&gt;)以不同的方式完成,然后可以创建一个特定于类型的人员树: new MyTree&lt;Person&gt;().
  • 这是书中的一个例子吗(我非常怀疑)? ArrayInObj 肯定不是一个人。为什么要从 Person 继承?
  • 您的代码转录有误。在 Lafore 书中,这三个类之间没有继承关系。建议作为错字关闭。

标签: java


【解决方案1】:

有三种可能:

  1. 您将构造函数 Person() 添加到您的 Person 类中
  2. 您使用 super(last, first, a) 作为 ArrayInObj 类构造函数中的第一个调用来调用现有构造函数
  3. 您的 ArrayInObj 类真的是人吗?看起来不像。删除extends Person

【讨论】:

    【解决方案2】:

    ArrayInObj 扩展Person,在ArrayInObj 的构造函数中,它隐式调用Person 构造函数super()(通过不显式调用不同的super())。但是,Person 类没有零参数构造函数。要么显式调用已定义的Person 构造函数super(a,b,c),要么没有ArrayInObj extends Person

    【讨论】:

      【解决方案3】:

      正如其他人所说,您需要在您的 Person 类中提供一个默认构造函数,以便 ArrayInObj 类可以使用它。

      您还将受益于阅读文档https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html 中有关构造函数的内容,或阅读本网站Java default constructor 中有关默认构造函数的内容。

      【讨论】:

        【解决方案4】:

        您收到此错误的技术原因是 ArrayInObj 的唯一构造函数隐式调用其超类的构造函数,如下所示:

        public ArrayInObj(int max) {
            /* this gets implicitly added and fails to compile */
            super();
            a = new Person[max];
            nElems = 0;
        }
        

        要修复编译错误,您可以显式调用超类的现有构造函数,也可以为Person 定义零参数构造函数。

        阅读您的代码,我觉得正确的解决方案是从ArrayInObj 的定义中删除extends Person。问问自己:ArrayInObjPerson 吗?不,它似乎是Person 数组的容器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-04
          • 1970-01-01
          • 2011-10-03
          • 1970-01-01
          • 1970-01-01
          • 2014-07-29
          相关资源
          最近更新 更多