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_;