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_;