在Java中扩展类而不初始化

时间:2017-04-22 04:19:24

标签: java oop inheritance

public class LinkedListStructs {
    public LinkedList l1 = new LinkedList();

    public LinkedListStructs(){
        ListNode h1 = new ListNode(4);
        ListNode h2 = new ListNode(3);
        ListNode h3 = new ListNode(12);
        ListNode h4 = new ListNode(9);
        ListNode h5 = new ListNode(9);
        ListNode h6 = new ListNode(4);
        l1.head = h1;
        h1.next = h2;
        h2.next = h3;
        h3.next = h4;
        h4.next = h5;
        h5.next = h6;
    }

}

然后我在其他课程中扩展这个:

public class Tester extends LinkedListStructs{

    public void removeDupsTest(){
      l1.printList();
      l1.removeDups();
      l1.printList();
      }

    }

我没有初始化LinkedListStructs的新实例。我的问题是,当我扩展一个类时,是一个自动创建的实例吗?

我很困惑,因为我在我的测试人员类中使用了LinkedList l1,但是对象本身需要使用构造函数进行初始化,如public LinkedListStructs(){}

所示

那么,它是如何运作的?如果我不创建实例,初始化链表的属性,那么如何使用它呢?

由于

3 个答案:

答案 0 :(得分:3)

要使用Tester,您必须创建它的实例。创建它时,您正在调用其构造函数。

由于您尚未指定构造函数,因此编译器会为您创建一个构造函数。您的空构造函数将调用超类构造函数。

要对此进行测试,请在TesterLinkedListStructs构造函数中向Tester类和printLns添加一个空构造函数。您将看到调用的构造函数,后者将调用超类构造函数。

请注意,空构造函数必须调用super(),它调用超类构造函数。

答案 1 :(得分:1)

Java为您指出:当您扩展具有无参数构造函数的类并且未定义构造函数时,派生类会自动获取默认构造函数:

  

JLS第8.8.9节:

     

如果一个类不包含构造函数声明,则会自动提供一个没有参数的默认构造函数。

     

如果声明的类是原始类Object,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。

构造Tester的实例时,会调用其基类LinkedListStructs的构造函数,初始化列表l1

答案 2 :(得分:1)

回答你的疑问:

由于您已经扩展了LinkedListStructs并创建了一个新的类Tester(意思是'公共类Tester扩展了LinkedListStructs')

所有行为都将在派生(或扩展)类中可用。这是继承(因此可重用性)的基础。您也可以选择覆盖它。这是针对多态的(你可以实现'来实现这一点)。

因为,Tester类中没有显式的构造函数。将调用默认构造函数,然后调用其所有超类构造函数。 Default constructor文档可以在这里找到。

我想这是你问题的直接答案。