原始数据类型

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

int gear = 1;

这样做会告诉您的程序存在一个名为“ gear”的字段,该字段保存数值数据,并且其初始值为“ 1”。变量的数据类型决定了它可能包含的值,以及可能对其执行的操作。除了int之外,Java 编程语言还支持其他七种原始数据类型。基本类型由语言预先定义,并由保留关键字命名。基本值不与其他基本值共享状态。 Java 编程语言支持的八种原始数据类型是:

  • 字节byte数据类型是 8 位带符号的二进制补码整数。最小值为-128,最大值为 127(含)。 byte数据类型对于在大的arrays中节省内存非常有用,在这里实际节省的内存很重要。它们也可以代替int,因为它们的限制有助于澄清您的代码;变量范围有限的事实可以作为文档的一种形式。

  • shortshort数据类型是一个 16 位带符号的二进制补码整数。最小值为-32,768,最大值为 32,767(含)。与byte一样,适用相同的准则:在实际节省内存的情况下,可以使用short将内存大阵列保存。

  • int :默认情况下,int数据类型是 32 位带符号的二进制补码整数,最小值为-231,最大值为 231-1.在 Java SE 8 和更高版本中,可以使用int数据类型表示无符号的 32 位整数,其最小值为 0,最大值为 232-1.使用 Integer 类可将int数据类型用作无符号整数。有关更多信息,请参见“数字类”部分。诸如compareUnsigneddivideUnsigned等静态方法已添加到Integer类,以支持无符号整数的算术运算。

  • longlong数据类型是 64 位二进制补码整数。带符号的 long 的最小值为-263,最大值为 263-1.在 Java SE 8 和更高版本中,可以使用long数据类型表示无符号的 64 位 Long,其最小值为 0,最大值为 244-1.当您需要的值范围比int提供的值宽时,请使用此数据类型。 Long类还包含compareUnsigneddivideUnsigned等方法来支持无符号 long 的算术运算。

  • floatfloat数据类型是单精度 32 位 IEEE 754 浮点。其值的范围超出了本讨论的范围,但是在 Java 语言规范的浮点类型,格式和值部分中指定。与byteshort的建议一样,如果需要将内存保存在大的浮点数数组中,请使用float(而不是double)。永远不要将这种数据类型用于精确值,例如货币。为此,您将需要使用java.math.BigDecimal类。 数字和字符串涵盖了BigDecimal和 Java 平台提供的其他有用的类。

  • doubledouble数据类型是 Double 精度 64 位 IEEE 754 浮点。其值的范围超出了本讨论的范围,但是在 Java 语言规范的浮点类型,格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。如上所述,此数据类型永远不能用于精确值,例如货币。

  • 布尔值boolean数据类型只有两个可能的值:truefalse。将此数据类型用于跟踪真/假条件的简单标志。这种数据类型代表一小部分信息,但是其“大小”并不是精确定义的。

  • charchar数据类型是单个 16 位 Unicode 字符。它的最小值为'\u0000'(或 0),最大值为'\uffff'(或 65,535(含))。

除了上面列出的八种原始数据类型之外,Java 编程语言还通过java.lang.String类为字符串 提供了特殊的支持。将字符串 括在 Double 引号中将自动创建一个新的String对象;例如String s = "this is a string";String对象是不可变的,这意味着一旦创建,它们的值就无法更改。 String类从技术上讲不是原始数据类型,但是考虑到语言对它的特殊支持,您可能会倾向于这样考虑。您将在简单数据对象中了解有关String类的更多信息

Default Values

声明字段时,不一定总是需要分配值。编译器会将已声明但未初始化的字段设置为合理的默认值。一般来说,此默认值为 0 或null,具体取决于数据类型。但是,通常认为依赖于此类默认值是不好的编程风格。

下表总结了上述数据类型的默认值。

Data Type默认值(用于字段)
byte0
short0
int0
long0L
float0.0f
double0.0d
char'\u0000'
字符串(或任何对象)null
booleanfalse

局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在try使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。

Literals

您可能已经注意到,初始化基本类型的变量时未使用new关键字。基本类型是语言中内置的特殊数据类型。它们不是从类创建的对象。 * literal *是固定值的源代码表示;Literals 直接在您的代码中表示,无需计算。如下所示,可以将 Literals 分配给基本类型的变量:

boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;

Integer Literals

如果整数 Literals 以字母Ll结尾,则类型为long;否则为int类型。建议您使用大写字母L,因为小写字母l很难与数字1区分。

可以从intLiterals 创建整数类型byteshortintlong的值。可以从longLiterals 中创建超出int范围的long类型的值。整数 Literals 可以通过以下数字系统表示:

  • 十进制:基数 10,数字由 0 到 9 组成;这是您每天使用的 Numbers 系统

  • 十六进制:基数为 16,其数字由数字 0 到 9 和字母 A 到 F 组成

  • Binary:基数 2,其数字由数字 0 和 1 组成(您可以在 Java SE 7 和更高版本中创建二进制 Literals)

对于通用编程,十进制可能是您将要使用的唯一数字系统。但是,如果需要使用其他数字系统,则以下示例显示正确的语法。前缀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;

Floating-Point Literals

如果浮点 Literals 以字母Ff结尾,则类型为float;否则,其类型为double,并且可以选择以字母Dd结尾。

浮点类型(floatdouble)也可以使用 E 或 e(用于科学计数法),F 或 f(32 位浮点 Literals)和 D 或 d(64 位 Double 精度 Literals)表示;这是默认值,且使用约定被省略)。

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

字符和字符串Literals

类型charString的 Literals 可以包含任何 Unicode(UTF-16)字符。如果您的编辑器和文件系统允许,则可以在代码中直接使用此类字符。如果没有,则可以使用“ Unicode 转义”,例如'\u0108'(带抑扬符的大写字母 C)或"S\u00ED Se\u00F1or"(西班牙语中的 SíSeñor)。 charLiterals 应始终使用“单引号”,StringLiterals 应始终使用“Double 引号”。 Unicode 转义序列可以在程序的其他位置(例如,在字段名称中)使用,而不仅仅是charStringLiterals。

Java 编程语言还支持charStringLiterals 的一些特殊转义序列:\b(退格),\t(制表符),\n(换行),\f(换页),\r(回车),\"(Double 引号) ,\'(单引号)和\\(反斜杠)。

还有一个特殊的nullLiterals 可用作任何引用类型的值。 null可以分配给任何变量,原始类型的变量除外。除了测试null值的存在之外,您几乎无能为力。因此,null通常在程序中用作标记,以指示某些对象不可用。

最后,还有一种特殊的 Literals,称为* classliteral *,是通过使用类型名称并附加“ .class";例如String.class”形成的。这是指代表类型本身的(类型Class)对象。

在数字 Literals 中使用下划线字符

在 Java SE 7 和更高版本中,数字 Literals 中数字之间的任何位置都可以出现任何数量的下划线字符(_)。例如,此功能使您可以使用。分隔数字 Literals 中的数字组,这可以提高代码的可读性。

例如,如果您的代码包含许多数字,则可以使用下划线字符将数字以 3 为一组的方式分开,类似于使用逗号或空格这样的标点符号作为分隔符的方式。

以下示例显示了在数字 Literals 中使用下划线的其他方式:

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;

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

  • 在数字的开头或结尾

  • 与浮点 Literals 中的小数点相邻

  • FL后缀之前

  • 在需要一 String 数字的位置

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

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