繁体   English   中英

在不初始化的情况下扩展Java类

[英]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类,并在TesterLinkedListStructs构造函数中添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM