在程序中创建基本类型变量
您已经了解到对象在字段中存储其状态。但是,Java 编程语言也使用术语变量。本节讨论这种关系,以及变量命名规则和约定、基本数据类型(基本类型、字符字符串和数组)、默认值和字面量。
基本类型
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
数据类型用作无符号整数。有关更多信息,请参见数字类部分。诸如compareUnsigned()
之类的静态方法已添加到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 语言规范。与byte
和short
的建议一样,如果您需要在大型浮点数数组中节省内存,请使用float
(而不是double
)。此数据类型永远不应用于精确值,例如货币。为此,您需要使用java.math.BigDecimal
类。 数字和字符串涵盖了BigDecimal
以及 Java 平台提供的其他有用类。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
类的更多信息。
使用默认值初始化变量
声明字段时并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或空,具体取决于数据类型。但是,依赖此类默认值通常被认为是不好的编程风格。
下表总结了上述数据类型的默认值。
数据类型 | 默认值(对于字段) |
---|---|
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
字面量创建。超过int
范围的long
类型的值可以从long
字面量创建。整数字面量可以通过以下数字系统表示
- 十进制:基数 10,其数字由数字 0 到 9 组成;这是您日常使用的数字系统
- 十六进制:基数 16,其数字由数字 0 到 9 以及字母 A 到 F 组成
- 二进制:基数 2,其数字由数字 0 和 1 组成(您可以在 Java SE 7 及更高版本中创建二进制字面量)
对于通用编程,十进制系统可能是您唯一会用到的数字系统。但是,如果您需要使用其他数字系统,以下示例显示了正确的语法。前缀0x
表示十六进制,0b
表示二进制
// The number 26, in decimal
int decimalValue = 26;
// The number 26, in hexadecimal
int hexadecimalValue = 0x1a;
// The number 26, in binary
int binaryValue = 0b11010;
浮点字面量
如果浮点字面量以字母F
或f
结尾,则其类型为float
;否则其类型为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
(带抑扬音的字母 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_;
上次更新: 2021 年 9 月 22 日