原始数据类型
Java编程语言是一门静态类型语言,这意味着你在使用变量之前必须先声明它。包括声明变量的类型和名称,如下所示:
int gear = 1;
这样我们告诉程序声明了一个名为"gear"的字段,它装载数值,初始化为1。数据类型决定了变量可以装载的值,以及它可以执行的操作。除了int,Java编程语言还支持其他7种原始类型。原始类型是语言预定义的,并且其命名作为保留字。原始值不与其他原始值共享状态。Java编程语言支持的8大原始类型如下:
8位有符号的整数。它的取值范围是(-128,127]。
16位有符号的整数,它的取值范围是(-32768,32767]
32位有符号的整数,它的取值范围是(-2的31次方,2的31次方-1]。
64位有符号的整数,它的取值范围是(-2的63次方,2的63次方-1]。
32位单精度浮点数,它的取值范围可以参考Floating-Point Types, Formats, and Values。该类型不应该用在精确的数值上,比如货币,如果有这样的需求,你可以使用java.math.BigDecimal。
64位双精度浮点数,对含小数的数值,该数据类型一般是默认类型。和float一样,它不应该用在精确的树枝上。
boolean类型只有两种可能的值,true和false。为跟踪真/假条件的简单标志而使用的数据类型。该数据类型描述了一个比特的信息,但关于它的大小一般没有精确的定义。
16位的Unicode字符。它的最小值为’\u0000’(或0),最大值为’\uffff’(或包括65,535)。
除了上面列出的8大数据类型。Java编程语言通过java.lang.String提供了对字符数组的特殊支持。通过双引号括起来的字符串将自动创建一个新的String对象。比如
String s = “this is a string”;字符串对象是不可变的,这意味着一经创建,它的值就不再改变。String类在技术上不是Java语言提供的原始类型,但考虑到语言对它的特殊支持,你也可以把它当做Java提供的原始类型。更多关于String的信息请参考Simple Data Objects。
默认值
声明一个字段后并不总是要赋值。未初始化的字段编译器会赋予一个默认值。一般来讲,这个值可能是0或者null,取决于它的数据类型。依赖这些默认值,通常来讲是比较糟糕的编程习惯。
下面的表格总结了以上数据类型的默认值:
数据类型 | 默认值(字段) |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘\u0000’ |
String | ‘’ |
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字面量来创建。数值字面量可以通过以下数值系统来表示:
- 十进制:由数字0~9组成,这也是你每天使用的数值系统
- 十六进制:由数字0~9和字母 A-F组成
- 二进制:由数字0~1组成
一般来讲,十进制的数值系统是你最常使用的。但是,如果你需要使用其他进制的数值系统,以下示例展示了正确的语法,前缀 0x 指明十六进制 ,0b指明二进制。
int decVal = 26;
int hexVal = 0x1a;
int binVal = 0b11010;
浮点字面量
以F或者f结尾的字面量表示float类型,否则它的类型是double,可选以D或者d结尾。
浮点数也可以使用科学计数法E来表示。
double d1 = 123.4;
double d2 = 1.234e2;
float f1 = 123.4f;
字符和字符串字面量
char和String类型的字面量可以包含任何Unicode字符。如果你的编辑器和文件系统支持的话,你可以直接在代码中使用这些Unicode字符。如果不行的话,可以使用Unicode转义符比如’\u0108’来表示大写的字母C。单引号的字面量表示char类型,双引号的字面量表示String类型。Unicode转义字符也可以用在程序的其他的地方,不仅仅是char或者String的字面量中。
Java编程语言也支持一些特殊的转义序列,比如:\b(back)、\t(tab)、\n(换行)、\f(换页)、\r(回车)、"(双引号)、’(单引号)、\(反斜线)。
null 字面量可以赋值给任意引用类型。它也可以赋值给任何变量,原始类型变量除外。除了测试它的存在性之外,null值几乎毫无用处。因此,null经常被程序用来表名一个对象不存在了。
最后,还有一种特殊的字面量叫做类字面量,它的格式是一个类型的名字再加上.class。比如:String.class 描述了String类自身。
在数字类型中使用下划线
在Java7和更高的版本中,任意数量的下划线都可以出现在数字字面量的任意两个数字之间。这个特性大大提高了数值的可读性。
当你的代码中包含位数很多的数值时,你可以使用下划线来将数值分隔为三位一组,类似于使用逗号或者空格等标点符号作为分隔符。
以下示例展示了在数值中使用下划线的其他方式:
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFF_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
long 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 socialSecurityNumber = 999_99_9999_L;
int x1 = 5_2;
// Invalid: cannot put underscores
// At the end of a literal
int x2 = 52_;
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;
int x6 = 0x5_2;
// Invalid: cannot put underscores
// at the end of a number
int x7 = 0x52_;