Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发布说明以获取有关所有JDK版本的新功能、增强功能和已删除或不推荐使用选项的信息。
Java编程语言是静态类型的,这意味着所有变量在使用之前必须先声明。这包括声明变量的类型和名称,就像你已经看到的:
int gear = 1;
这样做告诉你的程序,存在一个名为"gear"的字段,它保存数值数据,并且初始值为"1"。变量的数据类型决定它可以包含的值,以及可对其执行的操作。除了int
,Java编程语言还支持其他七种原始数据类型。原始类型由语言预定义,并由保留关键字命名。原始值与其他原始值不共享状态。Java编程语言支持的八种原始数据类型包括:
byte: byte
数据类型是一个8位的有符号的二进制补码整数。它的最小值是-128,最大值是127(包括)。byte
数据类型在大型数组中节省内存非常有用,这时内存的节省确实很重要。它们也可以用来替代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
数据类型作为无符号整数使用。请参阅“数字类”部分了解更多信息。在Integer
类中添加了诸如compareUnsigned
、divideUnsigned
等静态方法,以支持无符号整数的算术运算。
long: long
数据类型是一个64位的二进制补码整数。有符号的long最小值为-263,最大值为263-1。在Java SE 8及更高版本中,可以使用long
数据类型表示无符号的64位长整数,最小值为0,最大值为264-1。当需要比int
提供的范围更宽的值范围时,请使用此数据类型。Long
类还包含诸如compareUnsigned
、divideUnsigned
等方法,以支持无符号长整数的算术运算。
float: float
数据类型是单精度的32位IEEE 754浮点数。其值范围超出了本讨论的范围,但在Java语言规范的浮点类型、格式和值部分有详细说明。和byte
和short
的建议一样,如果需要在大量浮点数数组中节省内存,请使用float
(而不是double
)。该数据类型不应用于精确值,如货币。对于这种情况,需要使用java.math.BigDecimal类。Java平台还提供了数字和字符串,其中涵盖了BigDecimal
和其他有用的类。
double: double
数据类型是双精度64位IEEE 754浮点数。其值的范围超出了本讨论的范围,但在Java语言规范的浮点数类型、格式和值部分中有详细规定。对于十进制值,通常选择这种数据类型作为默认选择。如上所述,此数据类型不应用于精确值,如货币。
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对象是不可变的,这意味着一旦创建,它们的值就不能更改。String类在技术上不是原始数据类型,但考虑到语言对它的特殊支持,你可能会倾向于将其视为原始数据类型。在“简单数据对象”中你将了解更多关于String类的内容。
在声明字段时,不一定必须给它们赋值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,这个默认值将为零或null,具体取决于数据类型。然而,依赖这种默认值通常被认为是不良的编程风格。
下表总结了上述数据类型的默认值。
数据类型 | 默认值(用于字段) |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
String(或任何对象) | null |
boolean | false |
局部变量有些不同;编译器从不为未初始化的局部变量分配默认值。如果无法在声明变量的位置初始化局部变量,请确保在使用之前为其赋值。访问未初始化的局部变量将导致编译时错误。
你可能已经注意到,在初始化原始类型的变量时不使用new关键字。原始类型是内置于语言中的特殊数据类型;它们不是从类创建的对象。字面值是固定值的源代码表示形式;字面值直接在代码中表示,无需计算。如下所示,可以将字面值分配给原始类型的变量:
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
字面值中创建。类型为 long
的值超过 int
范围时,可以从 long
字面值中创建。整数字面值可以使用以下数字系统表示:
对于通用编程来说,十进制系统可能是你唯一使用的数字系统。但是,如果需要使用其他数字系统,以下示例显示了正确的语法。前缀 0x
表示十六进制,0b
表示二进制:
// 十进制的数字 26 int decVal = 26; // 十六进制的数字 26 int hexVal = 0x1a; // 二进制的数字 26 int binVal = 0b11010;
如果浮点数字面值以字母 F
或 f
结尾,则它的类型为 float
;否则为 double
类型,并且可以选择以字母 D
或 d
结尾。
浮点数类型(float
和 double
)也可以使用 E 或 e(表示科学计数法)、F 或 f(32 位浮点字面值)和 D 或 d(64 位双精度字面值;这是默认值,并且按照约定通常省略)进行表示。
double d1 = 123.4; // 与 d1 值相同,但使用科学计数法表示 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
(制表符), \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):
// 无效:不能将下划线放在 // 小数点旁边 float pi1 = 3_.1415F; // 无效:不能将下划线放在 // 小数点旁边 float pi2 = 3._1415F; // 无效:不能将下划线放在 // L后缀之前 long socialSecurityNumber1 = 999_99_9999_L; // OK(十进制字面量) int x1 = 5_2; // 无效:不能将下划线放在 // 字面量的结尾 int x2 = 52_; // OK(十进制字面量) int x3 = 5_______2; // 无效:不能将下划线放在 // 0x基数前缀 int x4 = 0_x52; // 无效:不能将下划线放在 // 数字的开头 int x5 = 0x_52; // OK(十六进制字面量) int x6 = 0x5_2; // 无效:不能将下划线放在 // 数字的结尾 int x7 = 0x52_;