我目前正在开发一个使用继承类结构的 Java 项目。我有一个超类
DigitalResources
和一个继承自 DigitalBook
的子类 DigitalResources
。这两个类都有一个 id
属性,并且 DigitalBook
有几个附加属性(numberPages
、genre
、editorial
、description
)。
我使用 Gson 序列化和反序列化这些类的对象,以从文本文件中保存和检索它们。我还有一个
Loan
类,它具有 DigitalBook
属性。
问题是:当我创建
Loan
对象然后打印它时,DigitalBook
的特定属性打印为 null
。但是,当我在创建 DigitalBook
对象后直接打印它时,所有属性都会正确显示。
该项目由用例构成,文件夹结构包括
data
、domain
和presentation
。它还包括 CRUD 操作。
此练习的目标是将产品数字化。为此,必须获得客户的所有需求,并将客户的需求转化为数字化解决方案。由于数字格式的兴起,阿维拉的数字图书馆需要一个应用程序来对所有类型的数字馆藏进行编目:书籍、音乐、视频、软件等。
项目声明 图书馆需要对数字馆藏进行分类,因此不能等待应用程序完全开发出来。他们告诉我们,最初他们想要对数字图书进行分类。此外,他们需要能够管理图书馆,为此他们需要:
我已将项目上传到我的 GitHub 帐户,您可以在这里查看。问题的部分已在活动拉取请求中上传。有兴趣的话就关注我吧
所以,我的问题是:有谁知道如何解决这个问题,即从
DigitalBook
对象打印时 null
的特定属性打印为 Loan
,但直接打印 DigitalBook
对象时打印正确?
任何帮助将不胜感激。预先感谢!
我尝试更改 Json 序列化,更改父级和子级之间的
id
属性。还有很多其他的事情,但没有任何效果
将您的超类标记为
abstract
以避免无意的实例化。
您没有给我们任何可以使用的代码。所以让我给你一些示例代码。
定义你的超类,
DigitalResource
。我们将这个类设为abstract
,因为我们打算实例化其子类的对象,但绝不会直接实例化这个类。
package work.basil.example.inherit;
public abstract class DigitalResource
{
public long id;
public DigitalResource ( final long id )
{
this.id = id;
}
@Override
public String toString ( )
{
// This method will never be executed. Being abstract means no such object can be instantiated.
return "DigitalResource{" +
"id=" + id +
'}';
}
}
定义一个具体的子类,
DigitalBook
。该子类继承其超类的字段,DigitalResource
。
package work.basil.example.inherit;
public class DigitalBook extends DigitalResource
{
int numberPages;
String genre, editorial, description;
public DigitalBook ( final long id , final int numberPages , final String genre , final String editorial , final String description )
{
super( id );
this.numberPages = numberPages;
this.genre = genre;
this.editorial = editorial;
this.description = description;
}
@Override
public String toString ( )
{
return "DigitalBook{" +
"id=" + id +
", description='" + description + '\'' +
", editorial='" + editorial + '\'' +
", genre='" + genre + '\'' +
", numberPages=" + numberPages +
'}';
}
}
注意子类和超类都重写了继承的方法
Object#toString
。那么,当在 toString
引用变量中保存的 DigitalBook
对象上调用 DigitalResource
时,将执行哪个 toString
方法实现?由于多态动态调度的魔力,最具体的子类的实现获胜。让我们看看实际效果。
package work.basil.example.inherit;
public class App
{
public static void main ( String[] args )
{
App app = new App( );
app.demo( );
}
private void demo ( )
{
DigitalResource resource = new DigitalBook( 1 , 42 , "Fiction" , "Good book" , "Blah." );
System.out.println( "resource = " + resource.toString( ) );
}
}
运行时输出:
resource = DigitalBook{id=1, description='Blah.', editorial='Good book', genre='Fiction', numberPages=42}