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(){}
那么,它是如何运作的?如果我不创建实例,初始化链表的属性,那么如何使用它呢?
由于
答案 0 :(得分:3)
要使用Tester
,您必须创建它的实例。创建它时,您正在调用其构造函数。
由于您尚未指定构造函数,因此编译器会为您创建一个构造函数。您的空构造函数将调用超类构造函数。
要对此进行测试,请在Tester
和LinkedListStructs
构造函数中向Tester类和printLns添加一个空构造函数。您将看到调用的构造函数,后者将调用超类构造函数。
请注意,空构造函数必须调用super(),它调用超类构造函数。
答案 1 :(得分:1)
Java为您指出:当您扩展具有无参数构造函数的类并且未定义构造函数时,派生类会自动获取默认构造函数:
JLS第8.8.9节:
如果一个类不包含构造函数声明,则会自动提供一个没有参数的默认构造函数。
如果声明的类是原始类Object,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。
构造Tester
的实例时,会调用其基类LinkedListStructs
的构造函数,初始化列表l1
。
答案 2 :(得分:1)
回答你的疑问:
由于您已经扩展了LinkedListStructs并创建了一个新的类Tester(意思是'公共类Tester扩展了LinkedListStructs')
所有行为都将在派生(或扩展)类中可用。这是继承(因此可重用性)的基础。您也可以选择覆盖它。这是针对多态的(你可以实现'来实现这一点)。
因为,Tester类中没有显式的构造函数。将调用默认构造函数,然后调用其所有超类构造函数。 Default constructor文档可以在这里找到。
我想这是你问题的直接答案。