# 原始数据类型

> 原文： [https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)

Java 编程语言是静态类型的，这意味着必须首先声明所有变量才能使用它们。这包括声明变量的类型和名称，如您所见：

```
int gear = 1;

```

这样做会告诉程序一个名为“gear”的字段存在，保存数字数据，初始值为“1”。变量的数据类型确定它可能包含的值，以及可能对其执行的操作。除`int`外，Java 编程语言还支持其他七种 _ 原始数据类型 _。基本类型由语言预定义，并由保留关键字命名。原始值不与其他原始值共享状态。 Java 编程语言支持的八种原始数据类型是：

*   **byte** ：`byte`数据类型是一个 8 位带符号的二进制补码整数。它的最小值为-128，最大值为 127（含）。 `byte`数据类型可用于在大型[阵列](arrays.html)中保存内存，其中节省的内存实际上很重要。它们也可用于代替`int`，其限制有助于澄清您的代码;变量范围有限的事实可以作为一种文档形式。

*   **short** ：`short`数据类型是一个 16 位带符号的二进制补码整数。它的最小值为-32,768，最大值为 32,767（含）。与`byte`一样，适用相同的指导原则：在内存节省实际上很重要的情况下，您可以使用`short`来节省大型阵列中的内存。

*   **int** ：默认情况下，`int`数据类型是 32 位带符号的二进制补码整数，其最小值为-2 &lt;sup&gt;31&lt;/sup&gt; ，最大值为 2 &lt;sup&gt;] 31&lt;/sup&gt; -1。在 Java SE 8 及更高版本中，您可以使用`int`数据类型来表示无符号的 32 位整数，其最小值为 0，最大值为 2 &lt;sup&gt;32&lt;/sup&gt; -1。使用 Integer 类将`int`数据类型用作无符号整数。有关更多信息，请参阅数字类一节。 [HTD8] `Integer` 类中添加了`compareUnsigned`，`divideUnsigned`等静态方法，以支持无符号整数的算术运算。

*   **long** ：`long`数据类型是 64 位二进制补码整数。带符号长度的最小值为-2 &lt;sup&gt;63&lt;/sup&gt; ，最大值为 2 &lt;sup&gt;63&lt;/sup&gt; -1。在 Java SE 8 及更高版本中，您可以使用`long`数据类型来表示无符号的 64 位长，其最小值为 0，最大值为 2 &lt;sup&gt;64&lt;/sup&gt; -1。当您需要比`int`提供的值更宽的值时，请使用此数据类型。 [`Long`](https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html) 类还包含`compareUnsigned`，`divideUnsigned`等方法，以支持无符号长整数的算术运算。

*   **float** ：`float`数据类型是单精度 32 位 IEEE 754 浮点数。其值范围超出了本讨论的范围，但在 Java 语言规范的[浮点类型，格式和值](https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3)部分中指定。与`byte`和`short`的建议一样，如果需要在大型浮点数中保存内存，请使用`float`（而不是`double`）。绝不应将此数据类型用于精确值，例如货币。为此，您需要使用 [java.math.BigDecimal](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html) 类。 [数字和字符串](../data/index.html)涵盖`BigDecimal`和 Java 平台提供的其他有用类。

*   **double** ：`double`数据类型是双精度 64 位 IEEE 754 浮点数。其值范围超出了本讨论的范围，但在 Java 语言规范的[浮点类型，格式和值](https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3)部分中指定。对于十进制值，此数据类型通常是默认选择。如上所述，此数据类型不应用于精确值，例如货币。

*   **boolean** ：`boolean`数据类型只有两个可能的值：`true`和`false`。将此数据类型用于跟踪真/假条件的简单标志。此数据类型表示一位信息，但其“大小”不是精确定义的内容。

*   **char** ：`char`数据类型是一个 16 位 Unicode 字符。它的最小值为`'\u0000'`（或 0），最大值为`'\uffff'`（或 65,535（含））。

除了上面列出的八种原始数据类型之外，Java 编程语言还通过 [java.lang.String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) 类为字符串提供特殊支持。将字符串括在双引号内将自动创建一个新的`String`对象;例如，`String s = "this is a string";`。 `String`对象是 _ 不可变 _，这意味着一旦创建，它们的值就无法更改。 `String`类在技术上不是原始数据类型，但考虑到语言给予它的特殊支持，您可能倾向于将其视为这样。您将在[简单数据对象](../data/index.html)中了解有关`String`类的更多信息

## 默认值

声明字段时并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说，此默认值为零或`null`，具体取决于数据类型。然而，依赖于这样的默认值通常被认为是糟糕的编程风格。

下表总结了上述数据类型的默认值。

| **数据类型** | **默认值（对于字段）** |
| :-- | :-- |
| 字节 | 0 |
| 短 | 0 |
| INT | 0 |
| 长 | 0L |
| 浮动 | 0.0F |
| 双 | 0.0D |
| 烧焦 | '\ u0000 的' |
| 字符串（或任何对象） | 空值 |
| 布尔 | 假 |

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果无法初始化声明它的局部变量，请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

### 字面

您可能已经注意到在初始化基本类型的变量时不使用`new`关键字。原始类型是语言中内置的特殊数据类型;它们不是从类创建的对象。 _ 文字 _ 是固定值的源代码表示;文字直接在代码中表示，无需计算。如下所示，可以将文字分配给基本类型的变量：

```
boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;

```

#### 整数文字

如果整数字面以`L`或`l`字母结尾，则为`long`类型;否则它是`int`类型。建议您使用大写字母`L`，因为小写字母`l`很难与数字`1`区分开来。

可以从`int`文字创建整数类型`byte`，`short`，`int`和`long`的值。可以从`long`文字创建超出`int`范围的`long`类型的值。整数文字可以用这些数字系统表示：

*   十进制：基数为 10，其数字由数字 0 到 9 组成;这是您每天使用的数字系统
*   十六进制：Base 16，其数字由数字 0 到 9 和字母 A 到 F 组成
*   二进制：基数 2，其数字由数字 0 和 1 组成（您可以在 Java SE 7 及更高版本中创建二进制文字）

对于通用编程，十进制系统可能是您将使用的唯一数字系统。但是，如果需要使用其他数字系统，以下示例将显示正确的语法。前缀`0x`表示十六进制，`0b`表示二进制：

```
// The number 26, in decimal
int decVal = 26;
//  The number 26, in hexadecimal
int hexVal = 0x1a;
// The number 26, in binary
int binVal = 0b11010;

```

#### 浮点文字

浮点文字的类型为`float`，如果它以字母`F`或`f`结尾;否则其类型为`double`，它可以选择以字母`D`或`d`结尾。

浮点类型（`float`和`double`）也可以用 E 或 e（用于科学记数法），F 或 f（32 位浮点字面量）和 D 或 d（64 位双字面值）表示;这是默认和按惯例省略）。

```
double d1 = 123.4;
// same value as d1, but in scientific notation
double d2 = 1.234e2;
float f1  = 123.4f;

```

#### 字符和字符串文字

类型`char`和`String`的文字可以包含任何 Unicode（UTF-16）字符。如果您的编辑器和文件系统允许，您可以直接在代码中使用这些字符。如果没有，您可以使用“Unicode 转义”，例如`'\u0108'`（带有 circumflex 的大写字母 C）或`"S\u00ED Se\u00F1or"`（西班牙语中的 SíSeñor）。始终对`char`文字使用“单引号”，对`String`文字使用“双引号”。 Unicode 转义序列可以在程序的其他地方使用（例如在字段名称中），而不仅仅在`char`或`String`文字中使用。

Java 编程语言还支持`char`和`String`文字的一些特殊转义序列：`\b`（退格），`\t`（制表符），`\n`（换行符），`\f`（换页） ，`\r`（回车），`\"`（双引号），`\'`（单引号）和`\\`（反斜杠）。

还有一个特殊的`null`文字，可以用作任何参考类型的值。除了基本类型的变量之外，`null`可以分配给任何变量。除了测试其存在外，您无法使用`null`值。因此，`null`通常在程序中用作标记，以指示某些对象不可用。

最后，还有一种称为 _ 类文字 _ 的特殊文字，通过获取类型名称并附加“`.class"`;例如，`String.class`。这是指对象（类型为`Class`） ]）代表类型本身。

## 在数字文字中使用下划线字符

在 Java SE 7 及更高版本中，任何数量的下划线字符（`_`）都可以出现在数字文字中的数字之间的任何位置。例如，此功能可用于您。分隔数字文字中的数字组，这可以提高代码的可读性。

例如，如果您的代码包含具有多个数字的数字，则可以使用下划线字符来分隔三个组中的数字，类似于使用逗号或空格等标点符号作为分隔符的方式。

以下示例显示了在数字文字中使用下划线的其他方法：

```
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

```

您只能在数字之间放置下划线;你不能在下列地方放置下划线：

*   在数字的开头或结尾
*   与浮点文字中的小数点相邻
*   在`F`或`L`后缀之前
*   在预期有一串数字的位置

以下示例演示了数字文字中有效和无效的下划线放置（突出显示）：

```
// Invalid: cannot put underscores
// adjacent to a decimal point
float pi1 = 3_.1415F;
// Invalid: cannot put underscores 
// adjacent to a decimal point
float pi2 = 3._1415F;
// Invalid: cannot put underscores 
// prior to an L suffix
long socialSecurityNumber1 = 999_99_9999_L;

// OK (decimal literal)
int x1 = 5_2;
// Invalid: cannot put underscores
// At the end of a literal
int x2 = 52_;
// OK (decimal literal)
int x3 = 5_______2;

// Invalid: cannot put underscores
// in the 0x radix prefix
int x4 = 0_x52;
// Invalid: cannot put underscores
// at the beginning of a number
int x5 = 0x_52;
// OK (hexadecimal literal)
int x6 = 0x5_2; 
// Invalid: cannot put underscores
// at the end of a number
int x7 = 0x52_;

```