Java原语可以被视为轻对象吗?

Posted

技术标签:

【中文标题】Java原语可以被视为轻对象吗?【英文标题】:Can Java primitives be considered light objects [closed] 【发布时间】:2013-08-05 14:30:07 【问题描述】:

根据这个答案here

java 对象和原语都在堆上。那么从 JVM 的角度来看,除了对象在堆上占用更多空间之外,对象和原语是否相似?本质上,图元只是“轻”对象吗?

【问题讨论】:

基元不是对象,即使在 JVM 级别也是如此。 【参考方案1】:

您推断出原语可以进入堆(作为其他对象的一部分)的事实,以得出结论它们可能是轻量级对象。一组原语构成了对象的状态。它们本身不是对象。

基元只有一个值。它们没有像对象那样的状态和行为。它们不表现出继承、多态性等。它们的行为不像实体,而是像它们的属性。

【讨论】:

原语确实有一个状态:它的当前值。 @TedHopp,那里的程度有所不同。人们几乎不会说,“循环退出时 int i 的状态是什么?”或者,“应用程序值已损坏”。它们不可互换,并且在语义上有所不同。 我认为根本没有任何语义差异。毕竟,对象的状态只不过是其字段的当前值(状态)的集合。 (这包括所有引用对象的状态。可以争论是否包含transient 字段,但原理相同。)原始字段当然可以处于损坏状态。如果代码在进行一些其他工作的同时正在交换字节,并且被中断(例如,被异常),则可以合理地认为原语处于损坏状态。 @TedHopp,我同意构成状态的一组值。这也是我回答的一部分。我认为值更多的是构成某些实体状态的单个元素。【参考方案2】:

这里有点混乱。你在你的问题中链接到的问题说原语 inside 一个对象可以在堆中。基元不能单独在堆中。

您不能像对象一样引用int,它们可以直接访问而不被“取消引用”。

【讨论】:

【参考方案3】:

Java 原语不是“轻量级对象”。他们是原始人。它们在两个非常重要的方面作为对象失败:它们不能进入 Collection 对象并且它们没有方法。

它们也不在堆上,除非作为实际 Java 对象的字段。你不能做new int。另请注意,当您声明一个原始类型的局部变量时,该变量就会存在。当你声明一个对象类型的局部变量时,你得到的只是一个对一个对象的引用,但是它被设置为null,并且通过简单地声明变量没有分配声明类型的对象。

请注意,autoboxing 有点模糊了区别,但区别确实存在。

【讨论】:

“不要放在堆上,除非作为实际 Java 对象的字段”。即使这样,人们也可能会争辩说它们不在堆上,它们只是代表对象的结构的一部分(恰好在堆中)。 @Thilo - 我试图说 Java 原语(孤立地)不能从堆中分配,同时还试图避免暗示对象的原语字段以某种方式从不同的内存中分配比对象本身(分配对象时)。 这是一个很好的短语:原始字段作为它包含的对象的一部分存储。这是否在堆上(在当前的 Java 中总是碰巧是)并不重要。与对象字段相反,对象字段仅将引用存储为对象的一部分,并且内容是单独分配的。 存储为包含它的对象的一部分。 ;-)

以上是关于Java原语可以被视为轻对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

原型中的数组和对象 - 不被视为引用

String 是 Android 或 Java 中的原语还是对象?

为啥返回 Java 对象引用比返回原语慢得多

可以将派生类对象视为与基类相同类型吗? <noobieQ/>

在比较 Java 中的两个原语与两个对象时,== 实际上是相同还是不同?

Java 对象销毁