Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
Java 编程语言是静态类型的,这意味着所有变量必须先声明才能使用。这包括说明变量的类型和名称,正如你已经看到的那样:
int gear = 1;
这样做会告诉程序存在名为 "gear" 的字段,持有数值数据,并且初始值为 "1"。变量的数据类型决定了它可能包含的值,以及可能对其执行的操作。除 int 外,Java 编程语言还支持其他七种 primitive data types (基本数据类型)。基本类型由语言预定义,并由保留关键字命名。基本值不与其他基本值共享状态。Java 编程语言支持的八种基本数据类型是:
byte:byte 数据类型是一个 8 位有符号补码整数。它的最小值为-128,最大值为 127(包括)。在需要内存节省的地方,可以将 byte 数据类型用于大型 arrays 中以节省内存。它们也可以用来代替 int 它们的限制有助于阐明代码;变量的范围是有限的这一事实可以作为文档的一种形式。
short:short 数据类型是一个 16 位有符号补码整数。它的最小值为-32,768,最大值为 32,767(包括)。与 byte 一样,适用相同的准则:在节省内存的情况下,可以将 short 保存在大型数组中以节省内存。
int:默认情况下,int 数据类型是一个 32 位有符号的补码整数,其最小值为-231,最大值为 231-1。在 Java SE 8 和更高版本中,可以使用 int 数据类型来表示无符号的 32 位整数,其最小值为 0,最大值为 232-1。使用 Integer 类将 int 数据类型用作无符号整数。有关更多信息,请参阅数字类部分。类似 compareUnsigned,divideUnsigned 等静态方法已被添加到 Integer 类中以支持无符号整数的算术运算。
long:long 数据类型是一个 64 位二进制补码整数。带符号的 long 的最小值为 -263,最大值为 263-1。在 Java SE 8 和更高版本中,可以使用 long 数据类型来表示一个无符号的 64 位 long,它的最小值为 0,最大值为 264-1。当你需要的范围值比 int 提供的范围宽时,使用此数据类型。Long 类还包含像 compareUnsigned, divideUnsigned 等方法来支持无符号 long 的算术运算。
float:float 数据类型是一个单精度 32 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的 Floating-Point Types, Formats, and Values 部分中进行了指定。对于 byte 和 short 的建议,如果你需要节省内存,在浮点数的大数组中请使用 float(而不是 double)。此数据类型不应用于精确值,例如货币。为此,你需要改为使用 java.math.BigDecimal 类。Numbers and Strings 涵盖了 Java 平台提供的 BigDecimal 和其他有用的类。
double:double 数据类型是一个双精度 64 位 IEEE 754 浮点。其值范围超出了本讨论的范围,但在 Java 语言规范的 Floating-Point Types, Formats, and Values 部分中进行了指定。对于十进制值,这种数据类型通常是默认的选择。如上所述,此数据类型不应用于精确值,例如货币。
boolean:boolean 数据类型只有两个可能的值:true 和 false。将此数据类型用于跟踪真/假条件的简单标志。此数据类型表示一位信息,但它的“大小”并不是精确定义的。
char:char 数据类型是一个 16 位 Unicode 字符。它的最小值为 '\u0000'(或 0),最大值为 '\uffff'(或 65,535)。
除了上面列出的八种基本数据类型之外,Java 编程语言还通过 java.lang.String 类为字符串提供了特别的支持。用双引号括起你的字符串会自动创建一个新的 String 对象;例如,String s = "this is a string";。String 对象是 immutable (不可变的),这意味着一旦创建,它们的值就不能改变。String 类在技术上不是原始数据类型,但考虑到该语言给予它的特殊支持,你可能倾向于这样认为。你将在 Simple Data Objects 中了解有关 String 类的更多信息
当声明一个字段时,并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,根据数据类型的不同,此默认值将为零或 null。然而,依赖于这种默认值,通常被认为是糟糕的编程风格。
以下图表总结了上述数据类型的默认值。
| 数据类型 | 默认值(对于字段) |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0L |
| float | 0.0f |
| double | 0.0d |
| char | '\u0000' |
| String(或任何对象) | null |
| boolean | false |
局部变量略有不同;编译器从不将默认值分配给未初始化的局部变量。如果你不能初始化声明它的局部变量,确保在你尝试使用它之前给它赋值。访问未初始化的本地变量将导致编译时错误。
你可能已经注意到,在初始化基本类型的变量时,不会使用 new 关键字。基本类型是内置于语言中的特殊数据类型;它们不是从一个类创建的对象。一个 literal 是固定值的源代码表示;字面量直接在你的代码中表示而不需要计算。如下所示,可以将一个字面量分配给基本类型的变量:
boolean result = true; char capitalC = 'C'; byte b = 100; short s = 10000; int i = 100000;
一个整数字面量如果以字母 L 或 l 结尾则其类型为 long;否则它是 int 类型。建议你使用大写字母 L,因为小写字母 l 难以与数字 1 区分。
整型 byte,short,int 和 long 的值可以从 int 字面量创建。超过 int 范围的 long 类型的值可以由 long 字面量创建。整数字面量可以用这些数字系统表示:
对于通用编程,十进制系统可能是你将要使用的唯一数字系统。但是,如果你需要使用其他数字系统,则以下示例显示正确的语法。前缀 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;
如果以字母 F 或 f 结尾,则浮点字面量的类型为 float;否则它的类型是 double,它可以选择以字母 D 或 d 结尾。
浮点类型(float 和 double)也可以用 E 或 e(科学记数法),F 或 f(32 位 float 字面量)和 D 或 d(64 位double 字面量;这是默认值,按照规范被省略)。
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'(带扬抑符的大写字母 C),或者 "S\u00ED Se\u00F1or"(Sí Señor 在西班牙语中)。char 字面量总是使用 '单引号' ,String 字面量总是使用 "双引号" 。Unicode 转义序列可以在程序中的其他地方使用(例如在字段名称中),而不仅仅在 char 或 String 字面量中使用。
Java 编程语言还支持 char 和 String 字面量的一些特殊转义序列:\b(退格),\t (tab),\n(换行符),\f(换页符),\r (回车),\" (双引号), \' (单引号)和 \\(反斜杠)。
还有一个特殊的 null 字面量,可以用作任何引用类型的值。可以将 null 分配给任何变量,但基本类型的变量除外。对于 null 值,除了测试它的存在之外,几乎没有别的可做的。因此,null 通常在程序中用作标记来指示某个对象不可用。
最后,还有一种特殊类型的字面量,称为 class literal,通过取一个类型名称并加上 ".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_;