英文:
How is it possible to define a List, or similar data type. of the same class into a class?
问题
以下是翻译好的内容:
我无法理解类似这样的事情怎么可能,现在我在我收到的代码中有以下的结构:
public class DayhoursItem {
@SerializedName("code")
private String code;
@SerializedName("name")
private String name;
@SerializedName("dayhours")
private List<DayhoursItem> dayhours;
据我所知,要使用dayhours,你需要定义一个DayhoursItem,然后需要在其中定义一个DayHoursItem对象的列表,然后该对象需要再定义一个DayHoursItem对象的列表,依此类推。
代码虽然在运行,但我无法理解为什么,因此我想知道为什么会出现这种情况(它的行为方式是怎样的)。
英文:
I cannot understand how something like that is possible, right now I've an structure like the following in a code I've been passed:
public class DayhoursItem {
@SerializedName("code")
private String code;
@SerializedName("name")
private String name;
@SerializedName("dayhours")
private List<DayhoursItem> dayhours;
As far as I know in order to use dayhours, you would need to define a DayhoursItem that would need to define a list with a DayHoursItem object that would need to define a list with a DayHoursItem object... and so on.
The code is working but I cannot understand why, so I'd like to know how exactly that can be (how is the way it's behaving).
答案1
得分: 4
因为在Java中,任何引用仅仅是“标识”相应的对象。
这意味着:当您定义一个类并对其进行实例化时,所有的字段只是指向其他对象。每个对象在堆上有它自己的存储空间。
因此,dayhours
字段只是简单地指向一个列表对象,该对象的存储空间在堆的其他位置。无论该列表是空的还是包含其他DayHourItem
对象都无关紧要:总是只有一个“指针”从拥有它的DayHourItem
指向该列表对象。
这里没有递归。在其他编程语言中,类似的结构很可能是非法的。
当然,当DayHourItem
类的构造函数试图创建另一个 DayHourItem
对象(以添加到那个列表中)时,就会产生递归,并且会很快耗尽内存。
因此,要点是:这种“自我引用”可能会创建问题,但这并不一定总是情况。
英文:
Simple: because any reference in java only "identifies" the corresponding object.
This means: when you define a class, and instantiate it, all your fields only point to these other objects. Each object has its own storage on the heap.
So that dayhours
field simply points to a List object, that has its storage elsewhere in the heap. And it doesn't matter whether that list is empty, or contains other DayHourItem
object: there is always only one "pointer" to that list object, from the owning DayHourItem
.
There is no recursion here. In other languages, similar constructs might very well be illegal.
Of course, when say the constructor of the DayHourItem
class tries to create another DayHourItem
object (to be added to that list), then you have a recursion, and you run out of memory quickly.
So the point is: such "self references" can create problem, but that isn't necessarily always the case.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论