Java数据类型
如有关Java变量的文字所述,Java中的每个变量都有一个数据类型。数据类型分为两组:
- 原始数据类型
- 对象引用
变量占用内存中的一定数量的空间。变量占用多少内存取决于其数据类型。
基本数据类型的变量直接在分配给该变量的内存中包含该变量的值。例如,数字或者字符。
对象引用类型的变量与原始类型的变量不同。对象类型的变量也称为引用。变量本身不包含对象,但包含对对象的引用。该引用指向整个对象存储在内存中的其他位置。通过存储在变量中的引用,我们可以访问引用对象的字段和方法。可能有许多不同的变量引用同一个对象。这对于原始数据类型是不可能的。
原始数据类型
Java语言包含以下原始数据类型:
数据类型 </ b> | 描述</ b> |
boolean | 二进制值“ true”或者“ false” |
byte | 8位有符号值,值从-128到127 |
short | 16位有符号值,值从-32.768到32.767 |
char | 16位Unicode字符 |
int | 32位有符号值,值从-2.147.483.648到2.147.483.647 |
long | 64位有符号值,值从-9.223.372.036.854.775.808到9.223.372.036.854.775.808 |
float | 32位浮点值 |
double | 64位浮点值 |
这些是原始数据类型,意味着它们既不是对象,也不是对象的引用(类和对象将在本Java教程的后续文章中进行说明)。
这是一个如何声明基本类型变量的示例:
int myInt;
对象类型
基本类型也以成熟对象的版本出现。这意味着我们可以通过对象引用来引用它们,可以有多个引用相同的值,并且可以像在Java中的任何其他对象上一样对它们调用方法。下面的核心对象数据类型列表包含原始类型的对象版本。该列表还包含Java中的其他一些核心对象类型。
数据类型 </ b> | 描述</ b> |
Boolean布尔值 | “ true”或者“ false” |
Byte字节 | 8位有符号值,值从-128到127 |
Short | 16位有符号值,值从-32.768到32.767 |
Char字符 | 16位Unicode字符 |
Int整数 | 32位有符号值,值从-2.147.483.648到2.147.483.647 |
Long | 64位有符号值,值从-9.223.372.036.854.775.808到9.223.372.036.854.775.808 |
Float浮点数 | 32位浮点值 |
Double | 64位浮点值 |
String | N字节的文本数据的Unicode字符串。不变 |
请注意,对象类型的名称开头是如何用大写字母拼写的,其中原始版本(非对象)的所有小写字符都用拼写形式拼写。缩写也有区别,例如int和Integer以及char和char字符。
当然,我们可以在Java API中使用许多其他组件,但是上述数据类型是Java的核心类型。 String类型在其自己的文本中进行了详细说明:Java Strings。
我们还可以通过创建自定义类来创建自己的更复杂的数据类型。我将在后面的文章中回到如何做。
这是我们如何声明一种(引用)核心对象类型的变量的方法:
Integer myInteger;
声明对象引用变量时,引用不会指向任何对象。我们需要首先创建(实例化)一个对象。这是如何完成的:
Integer myInteger; myInteger = new Integer(45);
这个例子使myInteger变量引用一个内部包含值45的Integer对象。它是创建Integer对象的代码的new Integer(45)部分。
我们也可以在声明变量时已经创建对象,如下所示:
Integer myInteger = new Integer(45);
原始数据类型的对象版本是不可变的
基本数据类型的对象版本是不可变的,这意味着存储在它们内部的值一旦设置就无法更改。例如,一旦创建了对象,就无法更改存储在"整数"对象中的值。
但是,可以使引用该对象的变量指向另一个对象。这是一个例子:
Integer myInteger = new Integer(45); myInteger = new Integer(33);
如我们所见,示例中的变量指向另一个" Integer"对象。
自动装箱
在Java 5之前,我们必须在原始类型的对象版本上调用方法,以将其值作为原始类型获取。例如:
Integer myInteger = new Integer(45); int myInt = myInteger.intValue();
在Java 5中,我们有一个称为"自动装箱"的概念。这意味着如果需要,Java可以自动"装箱"对象版本中的基本变量,或者如果需要,可以"取消装箱"原始数据类型的对象版本。例如,前面的示例可以这样写:
Integer myInteger = new Integer(45); int myInt = myInteger;
在这种情况下,Java将自动从" myInteger"对象中提取" int"值,并将该值分配给" myInt"。
同样,创建原始数据类型变量的对象版本是Java之前的一项手动操作:
int myInt = 45; Integer myInteger = new Integer(myInt);
借助自动装箱,Java可以为我们做到这一点。现在我们可以编写:
int myInt = 45; Integer myInteger = myInt;
然后,Java将自动将原始数据类型"装箱"在相应类型的对象版本中。
Java的自动装箱函数使我们可以使用通常需要该数据类型的对象版本的原始数据类型,反之亦然。但是要记住一个陷阱。对象类型的变量(对对象的引用)可以指向" null",这意味着它没有指向任何对象。如果尝试将" null"转换为原始值,则会得到" NullPointerException"(导致程序失败的错误)。此代码显示了一个示例:
Integer myInteger = null; int myInt = myInteger;
这段代码可以编译,但是执行时会导致NullPointerException
,因为变量myInteger
指向null
。因此不可能转换(取消装箱)它指向的对象的值,因为它没有指向任何对象。