java编程语言是静态类型,这表示变量使用前必须声明。这涉及阐明该变量的类型和名称,如你已经看到了:
int gear = 1;
上面告诉你的程序,存在一个字段名为”gear”,存储数字的数据,初始值为“1”。变量的数据类型,决定它可以包含的值,还有它可以做的操作。对于int更多的是,java编程语言支持其他原生数据类型。原生类型是编程语言预定义的,而且类型名字也是保留字。原生类型的值,不会和其他原生类型的值共享状态。java编程语言支持八种原生类型:
byte:byte的数据类型是一个8位有符号的二进制补码整数。最小值是128,最大值是127(包括)。当节省内存很重要,byte数据类型在大数组中节省内存很有用。如果变量的值的限制有利于澄清代码,也可以用byte替代int;事实上,变量的范围限制,可以作为文档形式。
short:short数据类型是16位的有符号的补码整数。最小值是-32,768 ,最大值是32,767 (包括)。和byte相比,也有一样准则:当节省内存很重要,short数据类型在大数组中节省内存很有用。
int:int数据类型是32位的有符号的补码整数。最小值是-2,147,483,648 ,最大值是2,147,483,647 (包括)。对于完整的值,这个数据类型通常是默认选择,除非有其他原因(例如上述原因)。这个数据类型大多数情况下,足够你的程序使用整数。如果你需要一个更大范围的值,可以使用long。
long:long数据类型是64位的有符号的补码整数。最小值是-9,223,372,036,854,775,808 ,最大值是9,223,372,036,854,775,807 (包括)。当需要的值范围超过了int,就可以使用这个数据类型。
float:float 数据类型是单精度 32 位 IEEE 754 浮点数。它的值的范围超出了本讨论,但是可以参考java语言规范的浮点类型。和byte,short的建议一样,当你使用大量浮点数数组,需要节省内存,使用float。此数据类型永远不应该用于精确的值,如货币。为此,您将需要使用 java.math.BigDecimal 类来代替。Java 平台提供数字和字符串包括 BigDecimal 和的其他有用的类。
double:double数据类型是单精度 64 位 IEEE 754 浮点数。它的值的范围超出了本讨论,但是可以参考java语言规范的浮点类型。对于小数值,这个数据类型是默认选择。如上面的建议,此数据类型永远不应该用于精确的值。
boolean:boolean数据类型只有两个可能值:true和false.使用此数据作为简单标记来跟踪真/假条件。这种数据类型代表一个比特的信息,但它的“大小”没有明确界定。
char:char数据类型是单个16 位Unicode 字符。它的最小值是'\u0000' (或0),最大值是'\uffff'(或65,535 包括).
除了上面列出的8个原生数据类型,java编程语言通过类java.lang.String提供字符串的特殊支持。使用两个双引号包围字符串,会自动创建String对象;例如,String s = "this is a string";String对象是不可变的,这表示它一旦被创建,它的值就不可变。类String从技术上讲,它不是一个原生类型,但是可以认为,它是java语言特殊支持的,你可能会倾向于认为它是原生类型。
默认值
当字段声明,未必一定要赋值。字段声明了,但是没有初始化,编译器将会设置一个合理的默认值。一般来说,默认值是0或者null,取决于数据类型。但是,依靠这种默认值,一般认为是糟糕的编程风格。
下面的图标总结上面涉及的数据类型的默认值。
Data Type | Default Value (for fields) |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
String (or any object) | null |
boolean | false |
局部变量略有不同,编译器不会给一个没有初始化的局部变量赋默认值。如果你没有在局部变量声明时,初始化变量,那么,你必须在使用它之前给它赋值。访问一个没有初始化的局部变量,编译器会报错。
常量
你可能注意到初始化原生类型的变量,不用使用new关键字。原生类型是java语言内置的特殊数据类型,不是类创建的对象。常量是源代码里表示的固定值。常量直接表示代码中不要求计算。如下显示,原生类型的变量可以赋值常量:
boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;
Integer Literals
整数常量
如果整数常量结尾是字母L或者l,那么它是long类型,否则它就是int类型。推荐使用大写字母L,因为小写字母l和数字1很难区分。
从int常量,可以创建整数byte,short,int,long。long常量,可以创建超出int的范围的long类型的值。整数常量可以由下面数字系统表达:
十进制:10进制,包含从0到9的数字,这个是你每日都用的数字系统。
十六进制:16进制,包含0到9,字母A到F。
二进制: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结尾。
浮点型 (浮点和双精度) 也可以表示使用 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' ,char常量使用’单引号’,String常量使用”双引号”。Unicode 转义序列可以用于程序的其他地方(例如字段名),而不是char或String常量。
java编程语言对于char和String常量也支持其他转义:\b (退格键), \t (选项卡), \n (换行符), \f (换页符), \r (回车), \" (双引号), \' (单引号), \\ (反斜杠).
null常量,用于任何引用类型的值。null可以复制给任何变量,处理原生类型。使用null值,可以判断对象是否存在。所以,null常常用来在程序中标记,指示一些对象不可用。
最后,有一种特别的常量,成为类常量。格式是类型名字加上”.class”;例如,String.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;
// This is an identifier, not
// a numeric literal
int x1 = _52;
// OK (decimal literal)
int x2 = 5_2;
// Invalid: cannot put underscores
// At the end of a literal
int x3 = 52_;
// OK (decimal literal)
int x4 = 5_______2;
// Invalid: cannot put underscores
// in the 0x radix prefix
int x5 = 0_x52;
// Invalid: cannot put underscores
// at the beginning of a number
int x6 = 0x_52;
// OK (hexadecimal literal)
int x7 = 0x5_2;
// Invalid: cannot put underscores
// at the end of a number
int x8 = 0x52_;