[英]Extending a class in Java without initializing
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(){}
看到的那样
那么它是怎样工作的? 如果我不创建实例,请初始化链接列表的属性,然后如何使用它?
谢谢
要使用Tester
,您必须创建一个实例。 创建它时,您正在调用它的构造函数。
由于您尚未指定构造函数,因此编译器会为您创建一个构造函数。 空的构造函数将调用超类构造函数。
要对此进行测试,请将一个空的构造函数添加到Tester类,并在Tester
和LinkedListStructs
构造函数中添加printLns。 您将看到tester构造函数被调用,该构造函数又将调用超类构造函数。
请注意,您的空构造函数必须调用super(),后者将调用超类构造函数。
Java为您解决了这一问题:当扩展具有无参数构造函数的类并且不定义构造函数时,派生类将自动获得默认的构造函数:
JLS第8.8.9节:
如果类不包含构造函数声明,则会自动提供不带参数的默认构造函数。
如果要声明的类是原始类Object,则默认构造函数的主体为空。 否则,默认构造函数将简单地调用不带参数的超类构造函数。
在构造Tester
的实例时,将调用其基类LinkedListStructs
的构造函数,从而初始化列表l1
。
回答您的疑问:
由于您已经扩展了LinkedListStructs并创建了一个新的类Tester(“公共类Tester扩展了LinkedListStructs”的意思)
所有行为将在派生(或扩展)类中可用。 这是继承的基础(因此是可重用性)。 您也可以选择覆盖它。 这是针对多态的(您可以使用“实现”来实现)。
因为,Tester类中没有显式的构造函数。 默认构造函数将被调用,该构造函数将依次调用其所有超类构造函数。 可以在此处找到默认的构造函数文档。
我想那是您问题的直接答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.