【发布时间】: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