2017-04-22 74 views
0
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

所以你们看到,它是如何工作的?如果我不创建一个实例,初始化链表的属性,那么如何使用它?

感谢

+0

子类可以访问超类的所有“public”和“protected”字段。 – 4castle

+1

当你初始化你的子类时,你的超类首先被初始化! –

+0

您不应使用与广泛使用的标准API类型相匹配的非限定类型名称。此外,如果你实现了一个列表或其他容器类型,那么你应该对它所包含的类型进行泛化。 –

回答

3

要使用Tester,你必须创建它的一个实例。当你创建它时,你正在调用它的构造函数。

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

要测试此操作,请在TesterLinkedListStructs构造函数中为您的Tester类和printLns添加一个空的构造函数。您将看到名为的测试器构造函数,然后调用超类的构造函数。

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

+0

请注意,编译器提供的构造函数缺少定义的构造函数的术语是“default constructor”。这是Java的一个重要且基本的概念。请注意,程序员提供的无参数构造函数不是默认的构造函数,因为它是在类中定义的。只有在类中没有定义构造函数时,才会得到一个默认的构造函数。 –

+1

你是对的,我的答案应该包含这些细节 –

1

Java的数字出来给你:当您扩展,有一个参数的构造函数的一类,而没有定义构造函数,派生类自动获得一个默认的构造函数:

JLS节8.8.9:

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

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

当你构建的Tester一个实例,其基类LinkedListStructs的构造函数被调用,初始化列表l1

+0

关于“延长课堂”实际上并不是规则的一部分。无论何时,只要类没有提供默认构造函数,都会提供默认构造函数。超类没有无参数构造函数的问题不在于子类是否获得默认构造函数,而是它是否会起作用。如果调用的构造函数不存在,隐式调用'super()'将不起作用。这是所有构造函数都关心的问题,无论是显式还是默认。 –

1

要回答你的疑问:

既然你已经扩展了LinkedListStructs并创建了一个新的类测试仪(的“公共类测试仪扩展LinkedListStructs”的意思)

所有的行为将在获得的可用(或扩展)类。这是继承的基础(因此是可重用性)。你也可以选择重写它。这是为了多态(你可以有'实现'来实现这个)。

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

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

+0

这个答案唯一的错误是它引用了维基百科。至少那篇文章反过来引用了JLS,但是,即使上面的错误答案仍然引用了正确的JLS段落。像这样的正确答案当然应该。 –

+0

谢谢Lew Bloch,我已经更新了参考点JLS。 – arunk2