# Groovy 数据类型 - Java 类型——专有类型和引用类型

**URL:** <https://www.isharkfly.com/t/groovy-java/6909>\
**Category:** 程序语言\
**Created:** [November 25, 2012, 7:09am UTC](https://www.isharkfly.com/t/groovy-java/6909 "2012-11-25T07:09:26Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [November 25, 2012, 7:09am UTC](https://www.isharkfly.com/t/groovy-java/6909/1 "2012-11-25T07:09:26Z")

</div>

Java对专有类型（比如int/double/char/byte）和引用类型（比如 Object/String）采用不同的处理方式，java有固定的专有类型，并且它们是值类型——这种类型的变量的值实际上只是一个数字（或者字符，或者true/false值），在java 中不能创建自定义的值类型。

引用类型（除了专有类型之外的任何类型）——这种类型的变量实际上是指向一个对象。 有C/C++背景的读者也许把引用类型想象成指针——这是相似的概念。如果改变引用类型的 变量的值，这是没有改变到先前引用的对象——这仅仅是改变变量本身，让这个变量引用一  
个不同的对象，或者根本不引用任何对象。

不能在专有类型上进行方法调用，并且在java中也不能像java.lang.Object对象一 样对待专有类型，在使用容器的时候不能处理专有类型时特别痛苦，比如java.util.ArrayList。java的每个专有类型都有一个相应的包装类型，这个包装类型是一个用来存储专有类型值的引用类型，例如：int的包装类型是java.lang.Integer。 另一方面，比如在3_2 或者a_b中的星号“\*”操作符不是任何引用对象都支持，而是仅仅支持专有类型（ + 号除外，字符串支持 + 号），作为一个为什么这么痛苦的例子，让我们考虑有两组整数列表的例子，并且希望将这两组数字加起来之后放在第三个列表中，java代码也许是这样的：`// Java code!
ArrayList results = new ArrayList();
for (int i=0; i < listOne.size(); i++)
{
Integer first = (Integer)listOne.get(i); Integer second = (Integer)listTwo.get(i);
int sum = first.intValue()+second.intValue();
results.add (new Integer(sum));
}
`Java5的新特性会使这个工作简单一些，但是仍旧有两种类型密切关联（int和Integer），这导致了这个加法的复杂性，java这么处理的理由是：C的遗传并且基于性能上的考虑，groovy的答案是将更多的工作留给计算机，让程序员的工作更少。
