扩展Java中的类不初始化
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;
}
}
然后我在其他类扩展这样的:扩展Java中的类不初始化
public class Tester extends LinkedListStructs{
public void removeDupsTest(){
l1.printList();
l1.removeDups();
l1.printList();
}
}
我没有初始化的LinkedListStructs
一个新的实例。我的问题是,当我扩展一个类时,是否会自动创建一个实例?
我很困惑,因为我在测试类中使用LinkedList l1
,但对象本身需要一个构造函数初始化为您3210
所以你们看到,它是如何工作的?如果我不创建一个实例,初始化链表的属性,那么如何使用它?
感谢
要使用Tester
,你必须创建它的一个实例。当你创建它时,你正在调用它的构造函数。
由于您没有指定构造函数,因此编译器会为您创建一个构造函数。你的空构造函数将调用超类的构造函数。
要测试此操作,请在Tester
和LinkedListStructs
构造函数中为您的Tester类和printLns添加一个空的构造函数。您将看到名为的测试器构造函数,然后调用超类的构造函数。
请注意,您的空构造函数必须调用super(),它调用超类的构造函数。
请注意,编译器提供的构造函数缺少定义的构造函数的术语是“default constructor”。这是Java的一个重要且基本的概念。请注意,程序员提供的无参数构造函数不是默认的构造函数,因为它是在类中定义的。只有在类中没有定义构造函数时,才会得到一个默认的构造函数。 –
你是对的,我的答案应该包含这些细节 –
Java的数字出来给你:当您扩展,有一个参数的构造函数的一类,而没有定义构造函数,派生类自动获得一个默认的构造函数:
JLS节8.8.9:
如果一个类不包含构造函数声明,那么会自动提供一个不带参数的默认构造函数。
如果声明的类是原始类Object,则默认的构造函数具有空的主体。否则,默认构造函数只是简单地调用没有参数的超类构造函数。
当你构建的Tester
一个实例,其基类LinkedListStructs
的构造函数被调用,初始化列表l1
。
关于“延长课堂”实际上并不是规则的一部分。无论何时,只要类没有提供默认构造函数,都会提供默认构造函数。超类没有无参数构造函数的问题不在于子类是否获得默认构造函数,而是它是否会起作用。如果调用的构造函数不存在,隐式调用'super()'将不起作用。这是所有构造函数都关心的问题,无论是显式还是默认。 –
要回答你的疑问:
既然你已经扩展了LinkedListStructs并创建了一个新的类测试仪(的“公共类测试仪扩展LinkedListStructs”的意思)
所有的行为将在获得的可用(或扩展)类。这是继承的基础(因此是可重用性)。你也可以选择重写它。这是为了多态(你可以有'实现'来实现这个)。
因为在Tester类中没有显式构造函数。默认的构造函数将被调用,它将调用它的所有超类构造函数。Default constructor文档可以在这里找到。
我想这就是你的问题的直接答案。
这个答案唯一的错误是它引用了维基百科。至少那篇文章反过来引用了JLS,但是,即使上面的错误答案仍然引用了正确的JLS段落。像这样的正确答案当然应该。 –
谢谢Lew Bloch,我已经更新了参考点JLS。 – arunk2
子类可以访问超类的所有“public”和“protected”字段。 – 4castle
当你初始化你的子类时,你的超类首先被初始化! –
您不应使用与广泛使用的标准API类型相匹配的非限定类型名称。此外,如果你实现了一个列表或其他容器类型,那么你应该对它所包含的类型进行泛化。 –