JVM是否允许使用struct创建语言?我的意思是与C#(和IL)相同的结构。结构应该是自定义值类型,因此不是垃圾收集器的目标。不要误解我的意思我不希望Java与C#相同 - 我只想从那些完全理解Java和JVM设计方式和原因的人那里学到一些教训。没有它的动机是什么?是否在Java社区或Sun / Oracle的任何时候引入了struct?你知道周围故事的链接吗?
结论: SO不是一个提出这个问题的好地方。因为20年前没有人与这个决定有关。虽然下面提供了一些合理的SO用户,但他们出现了以下可能的原因:
答案 0 :(得分:4)
我认为理论上可能在Java中引入类似结构的, not 垃圾收集类型。但是,由于Java没有指针(并且永远不会有),所以类似结构的东西应该总是按值传递,就像原语一样。
主要优点是创建此值类型的大型数组,而数组中的每个项都没有自己的生命周期(以及垃圾回收负担)。
你可能会发现这篇关于在Java中引入结构(普通数据对象)的10年讨论很有意思:http://bugs.sun.com/view_bug.do?bug_id=4820062
答案 1 :(得分:2)
除了原语之外,Java没有类似于C#的“值类型”。我只能猜到为什么它是这样设计的;可能是为了简单。由于性能原因,基元不是对象。
答案 2 :(得分:1)
我强烈怀疑,就自定义语言而言,JVM会以任何方式阻止这种情况。它只是没有真正的帮助。你必须将结构类型的局部变量转换成一堆名称错误的原始类型局部变量,句柄(un)装箱以将它们存储在集合中并与Java库交互,并且通常提出并实现所有值 - 从头开始键入语义
答案 3 :(得分:-1)
C struct
与Java Objects
相当。在struct
中,您可以将多个复杂或原始数据类型打包到一个复杂数据类型中,该数据类型位于Java {{1} }或class
。
现在,您想要使用该对象的方式取决于您。您可以使用公共变量对其进行打包,也可以为其提供更多函数 / 方法来处理这些变量。所有这一切背后的全部思想是(与C语言不同)Java从一开始就被创建为面向对象的语言(好吧,Java中有一些小的方面,它们实际上不是OO的一部分,比如原语boolean,int等。但那是另一个故事。)
关于Object
,那就是Java中的一些普通程序员不应该(不得不)担心。如果Object何时以及何时进行垃圾收集,则由运行时决定。 (虽然可以强制进行垃圾收集,但这不太实用)。