Java编程语言是静态类型的,这意味着必须先声明所有变量,然后才能使用它们。正如您已经看到的,这涉及到声明变量的类型和名称:

  1. 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类”部分。像静态方法compareUnsigneddivideUnsigned等,已被添加到 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)类还包含,如compareUnsigneddivideUnsigned等方法,以支持无符号长整型的算术运算。
  • float(单精度浮点)float数据类型是单精度32位IEEE 754浮点。其值的范围超出了本文的讨论范围,但在Java语言规范的“ 浮点类型,格式和值”部分中进行了指定。与针对byteshort的建议一样,如果您需要将内存保存在大的浮点数数组中,请使用float(而不是double)。永远不要将这种数据类型用于精确值,例如货币。为此,您将需要使用 java.math.BigDecimal类。 数字和字符串涵盖了BigDecimal,以及Java平台提供的其他有用的类。
  • double(双精度浮点)double数据类型是双精度64位IEEE 754浮点。其值的范围超出了本文的讨论范围,但在Java语言规范的“ 浮点类型,格式和值”部分中进行了指定。对于十进制值,此数据类型通常是默认选择。如上所述,此数据类型决不能用于精确值,例如货币。
  • boolean(布尔型)boolean数据类型只有两个可能的值:truefalse。此数据类型是用于跟踪真/假条件的简单标志。这种数据类型代表一小部分信息,但是其“大小”并不是精确定义的。
  • 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 是固定值的源代码表示; 字面量直接在您的代码中表示,无需计算。如下所示,可以将字面量分配给基本类型的变量:

  1. boolean result = true;
  2. char capitalC = 'C';
  3. byte b = 100;
  4. short s = 10000;
  5. int i = 100000;

整型字面量

如果整型字面量以字母Ll结尾,则为long类型。否则,整型字面量为int类型。建议您使用大写字母L,因为小写字母l很难与数字1区分开。
可以从int字面量创造整型byteshortint,和long的字面量值。可以从long字面量中创建超出int范围的long字面量值。整型字面量可以通过以下数字系统表示:

  • 十进制(Decimal):基数10,其数码(digits)由0到9组成;这是您每天使用的数字系统
  • 十六进制(Hexadecimal):基数为16,其数码由数字0到9和字母A到F组成
  • 二进制(Binary):基数2,其数码由数字0和1组成(您可以在Java SE 7和更高版本中创建二进制字面量)

对于通用编程,十进制系统可能是您将要使用的唯一数字系统。但是,如果需要使用其他数字系统,则以下示例显示正确的语法。前缀0x表示十六进制,0b表示二进制:

  1. // The number 26, in decimal
  2. int decVal = 26;
  3. // The number 26, in hexadecimal
  4. int hexVal = 0x1a;
  5. // The number 26, in binary
  6. int binVal = 0b11010;

浮点型字面量

如果浮点型字面量以字母Ff结束,则为float类型。否则,其类型为double,并且可以选择以字母Dd结尾。
浮点类型(floatdouble)也可以使用E或e(用于科学计数法),F或f(32位浮点字面量)和D或d(64位双精度字面量;这是默认值,按惯例是省略)表示。

  1. double d1 = 123.4;
  2. // same value as d1, but in scientific notation
  3. double d2 = 1.234e2;
  4. float f1 = 123.4f;

字符型和字符串型字面量

charString类型的字面量可以包含任何Unicode(UTF-16)字符。如果您的编辑器和文件系统允许,则可以在代码中直接使用此类字符。如果不是,则可以使用“ Unicode转义”,例如'\u0108'(带音调符号的大写C),或"S\u00ED Se\u00F1or"(西班牙文的SíSeñor)。始终对char字面量使用“单引号”,对于String字面量始终使用“双引号” 。Unicode转义序列可在程序中其他地方的使用(如在字段名称),而不只是在charString字面量中。
Java编程语言还为charString字面量提供了一些特殊的转义序列:(\b退格键),\t(制表符),\n(换行),\f(换页),\r(回车),\"(双引号),\'(单引号)和\\(反斜杠)。
还有一个特殊的null字面量可以用作任何引用类型的值。null可以分配给任何变量,基本类型变量除外。null除了测试其存在之外,您几乎无法使用其他任何价值。因此,null通常在程序中用作标记,以指示某些对象不可用。
最后,还有一种特殊的字面量,称为class__字面量,它是通过使用类型名称,并附加".class"形成的,例如,String.class。class字面量表示类型本身的对象。

在数字字面量中使用下划线

在Java SE 7和更高版本的数字字面量中,数字之间的任何位置都可以出现任意数量的下划线字符(_)。例如,您可以使用此功能分隔数字数组中的数字字面量,这可以提高代码的可读性。
还例如,如果您的代码包含许多数字,则可以使用下划线字符将数字分成三组,类似于使用逗号或空格这样的标点符号作为分隔符的方式。
下面的示例显示了在数字字面量中使用下划线的其他方式:

  1. long creditCardNumber = 1234_5678_9012_3456L;
  2. long socialSecurityNumber = 999_99_9999L;
  3. float pi = 3.14_15F;
  4. long hexBytes = 0xFF_EC_DE_5E;
  5. long hexWords = 0xCAFE_BABE;
  6. long maxLong = 0x7fff_ffff_ffff_ffffL;
  7. byte nybbles = 0b0010_0101;
  8. long bytes = 0b11010010_01101001_10010100_10010010;

您只能在数字之间添加下划线;您不能在以下位置放置下划线:

  • 在数字的开头或结尾
  • 与浮点字面量中的小数点相邻
  • FL后缀之前
  • 在需要一串数字的位置

下面的示例,演示数字字面量中的有效和无效的下划线位置(突出显示):

  1. // Invalid: cannot put underscores
  2. // adjacent to a decimal point
  3. float pi1 = 3_.1415F;
  4. // Invalid: cannot put underscores
  5. // adjacent to a decimal point
  6. float pi2 = 3._1415F;
  7. // Invalid: cannot put underscores
  8. // prior to an L suffix
  9. long socialSecurityNumber1 = 999_99_9999_L;
  10. // OK (decimal literal)
  11. int x1 = 5_2;
  12. // Invalid: cannot put underscores
  13. // At the end of a literal
  14. int x2 = 52_;
  15. // OK (decimal literal)
  16. int x3 = 5_______2;
  17. // Invalid: cannot put underscores
  18. // in the 0x radix prefix
  19. int x4 = 0_x52;
  20. // Invalid: cannot put underscores
  21. // at the beginning of a number
  22. int x5 = 0x_52;
  23. // OK (hexadecimal literal)
  24. int x6 = 0x5_2;
  25. // Invalid: cannot put underscores
  26. // at the end of a number
  27. int x7 = 0x52_;