Java编程语言是静态类型的,这意味着必须先声明所有变量,然后才能使用它们。正如您已经看到的,这涉及到声明变量的类型和名称:
int gear = 1;
这样做会告诉您的程序,存在一个名为“gear”的字段,该字段保存数值数据,并且其初始值为“1”。变量的数据类型确定其可能包含的值,以及可能对其执行的操作。除了int
,Java编程语言还支持其他七种基本数据类型(primitive data types__)。基本类型由语言预先定义,并由保留的关键字命名。基本值不与其他基本值共享状态。Java编程语言支持的八种基本数据类型是:
- byte(字节):
byte
数据类型是8位带符号的二进制补码整数。最小值为-128,最大值为127(含)。byte
数据类型对于在大数组(arrays)中节省内存非常有用,因为内存节省实际上很重要。在int的有限范围内,也可以使用它们来代替int,以帮助您阐明代码;变量范围有限的事实可以作为文档的一种形式。 - short(短整型):
short
数据类型是一个16位带符号的二进制补码整数。最小值为-32,768,最大值为32,767(含)。与byte
一样,也适用相同的准则:在实际节省内存的情况下,可以使用short
来将内存保存为大数组。 - int(整型):默认情况下,
int
数据类型是32位带符号的二进制补码整数,其最小值为-2 ,最大值为2 -1。在Java SE 8和更高版本中,可以使用int
数据类型表示无符号的32位整数,其最小值为0,最大值为2 -1。使用Integer类,可将int
数据类型用作无符号整数。有关更多信息,请参见“Number类”部分。像静态方法compareUnsigned
,divideUnsigned
等,已被添加到Integer
类,以支持无符号整数的算术运算。 - long(长整型):
long
数据类型是64位二进制补码整数。带符号的long的最小值为-2 ,最大值为2 -1。在Java SE 8和更高版本中,可以使用long
数据类型表示无符号的64位长整型,其最小值为0,最大值为2 -1。当您需要的值范围,比int
所提供的宽时,请使用此数据类型。[Long](https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html)
类还包含,如compareUnsigned
,divideUnsigned
等方法,以支持无符号长整型的算术运算。 - 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
类的更多信息。
默认值
声明字段时,不一定总是需要分配值。编译器会将已声明,但未初始化的字段,设置为合理的默认值。一般来说,此默认值将为零或null
,具体取决于数据类型。但是,通常认为依赖于此类默认值是不好的编程风格。
下表总结了上述数据类型的默认值。
数据类型 | 默认值(用于字段) |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘\u0000’ |
String (or any object) | 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
区分开。
可以从int
字面量创造整型byte
,short
,int
,和long
的字面量值。可以从long
字面量中创建超出int
范围的long
字面量值。整型字面量可以通过以下数字系统表示:
- 十进制(Decimal):基数10,其数码(digits)由0到9组成;这是您每天使用的数字系统
- 十六进制(Hexadecimal):基数为16,其数码由数字0到9和字母A到F组成
- 二进制(Binary):基数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;
浮点型字面量
如果浮点型字面量以字母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__字面量,它是通过使用类型名称,并附加".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_;