【问题标题】:Does Java make distinction between value type and reference typeJava是否区分值类型和引用类型
【发布时间】:2011-07-09 05:59:46
【问题描述】:

C# 区分了这两者。 java做的一样还是不一样?

【问题讨论】:

标签: c# java value-type reference-type


【解决方案1】:

在Java中,所有的对象和枚举都是引用类型,所有的原语都是值类型。两者在复制语义方面的区别与 C# 相同,但不能在 Java 中定义新的值类型。

【讨论】:

  • 换句话说,Java 缺乏创建“快速”高效值类型的能力?
  • @Pacerier:目前(2014 年)在 Java 中是不可能的。有人正在调查:cr.openjdk.java.net/~jrose/values/values-0.html
  • 那么int xInteger x有区别吗?查看 java Integer.java 源代码,它是否说明它是作为值传递还是作为引用传递?
  • @Shimmy:int(原始类型)和Integer(类)之间有很多区别。目前所有的Java 类,例如Integer,都被视为引用类型。这意味着对Integer 对象的引用被传递。 (旁注:这与传递引用不同,Java 没有。请参阅stackoverflow.com/a/40523/454967 以获取完整说明。)
【解决方案2】:

在Java中,原语是值类型,类和数组是引用类型。

【讨论】:

    【解决方案3】:

    实际上,Java 中的所有内容都是按值传递的,引用是一种特殊类型的值,就像 C 中的指针是值一样。更多关于语义的信息请参见:

    http://javadude.com/articles/passbyvalue.htm

    另一方面,C# 确实有像 C++ 那样的真实引用,这些引用与引用值无关……还有比这更令人困惑的吗?

    【讨论】:

    • 你可以这样看:在Java中,一切都是作为一个值传递的,但有些对象可能是可变的。
    • -1 不,并非 Java 中的所有内容都是值。 Java 对象不是值;无法将对象作为值传递,它们不会像值一样被复制,等等。在 C 中,一切都是值,包括指针,并且可以在此之上构建引用语义。在 Java 中,引用语义是内置的,不可能像访问 C 结构作为值那样访问底层对象作为值。
    • @bames53 当然,我刚刚编辑了我的答案,使其比我们谈论的参数传递更清楚。仅仅因为我们无法访问实际数字并不意味着它不存在。
    • "Java 中的一切都是按值传递的" Java 对象不是按值传递的。
    • @bames32 这是因为 Java 不支持“对象”作为参数。它只支持原始类型和引用(又名指针),它们 docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2013-12-12
    相关资源
    最近更新 更多