【问题标题】:Java - how do I call copy constructor for subclass of subclass?Java - 如何为子类的子类调用复制构造函数?
【发布时间】:2023-04-07 06:18:01
【问题描述】:

所以我有一个名为“EducationalBook”的类,它是“Book”类的子类。而“Book”类是“PaperPublication”类的子类。

在我的理解中,普通类(如“PaperPublication”)的复制构造函数可以写成如下:

public class PaperPublication
{
    String title;
    double price;
    int nOP; //number of pages
    public PaperPublication(PaperPublication p)
    {
        title = p.title;
        price = p.price;
        nOP = p.nOP;
    }...

但是,我不确定如何为仅具有该类本身参数的子类构建复制构造函数(例如:仅具有参数(Book b)的“Book”类)。我只想要一个参数的原因是因为有一条规则,对于子类的复制构造函数,我必须调用父类的复制构造函数(我相信这意味着使用“super()”对吗?)。经过一番研究,虽然我没有找到明确的答案,但我是这样构建的:

public class Book extends PaperPublication
{
    long ISBN;
    int issued;
    String author;
    public Book(Book b)
    {
        super(b.getTitle(), b.getPrice(), b.getNOP());
        ISBN = b.ISBN;
        issued = b.issued;
        author = b.author;
    }...

我什至不确定这是不是正确的方法,但它至少在编译时没有发生任何编译阶段错误。

但是,对于 EducationalBook 类,我没有任何构建复制构造函数的单一想法。由于 Java 不允许使用 super.super() 之类的东西,并且我不允许使用参数化构造函数,而只能使用父类的复制构造函数。

public class EducationalBook extends Book
{
    int edition;
    String speciality;
    public EducationalBook(EducationalBook e)
    {
        //??? no clue..
    }
    public EducationalBook() // default constructor. is this right?
    {super();}
}

(还有一个问题,默认构造函数对吗?)

我觉得我对Java继承的理解总体上很薄弱。对我有什么启示吗?

【问题讨论】:

  • 应该是super(b),而不是super(b.getTitle(), b.getPrice(), b.getNOP());。只能调用实际存在的超级构造函数
  • 这是一个非常基础的java概念,建议大家多看一些书籍或教程,花点时间学习。
  • @HovercraftFullOfEels 感谢您指出这一点。仅供参考,我没有为 PaperPublication 类编写所有构造函数。实际上,这个问题中提到的所有 3 个类都有 3 个构造函数:参数化、复制和默认。但是我刚刚尝试了 super(b) 并且它确实编译了.. 这和 [super(b.getTitle(), b.getPrice(), b.getNOP())] 一样吗?
  • 我们怎么知道什么时候看不到那些构造函数呢?但至于我自己,我会保持简单。让子拷贝构造函数调用父拷贝构造函数。为什么要让自己难过?
  • @Dev911 为初级问题道歉。完全同意你,我确实需要一些时间来彻底学习 Java 概念。但在实际编程中,我不会费心使用“任何复制构造函数只有一个参数”,因为我可以通过使用父类的参数化构造函数轻松绕过它。这种“必须利用父类的复制构造函数”让我作废。

标签: java inheritance copy-constructor


【解决方案1】:

这比你想象的要容易。

Book的拷贝构造函数:

public Book(Book b)
{
  super(b);
  ISBN = b.ISBN;
  issued = b.issued;
  author = b.author;
}

还有EducationalBook的拷贝构造函数:

public EducationalBook(EducationalBook b)
{
  super(b);
  edition = b.edition;
  speciality = b.speciality;
}

【讨论】:

  • 护脸 谢谢!不知何故认为 Book 对象不能进入父类的复制构造函数参数。真丢人,一定是反过来搞糊涂了..
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2012-12-17
  • 2018-03-29
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多