系列中的上一篇
当前教程
在程序中创建基本类型变量
系列中的下一篇

系列中的上一篇: 创建变量并命名它们

系列中的下一篇: 在程序中创建数组

在程序中创建基本类型变量

您已经了解到对象在字段中存储其状态。但是,Java 编程语言也使用术语变量。本节讨论这种关系,以及变量命名规则和约定、基本数据类型(基本类型、字符字符串和数组)、默认值和字面量。

 

基本类型

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

int gear = 1;

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

  • byte: byte数据类型是 8 位有符号的二进制补码整数。它的最小值为 -128,最大值为 127(含)。byte数据类型对于在大型数组中节省内存很有用,在这些数组中,内存节省实际上很重要。它们也可以用在int的地方,它们的值范围有助于阐明您的代码;变量范围有限的事实可以作为一种文档形式。

  • short: short数据类型是 16 位有符号的二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。与byte一样,相同的准则适用:您可以使用short在大型数组中节省内存,在内存节省实际上很重要的情况下。

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

  • long: long数据类型是 64 位二进制补码整数。有符号的long的最小值为 -263,最大值为 263-1。在 Java SE 8 及更高版本中,您可以使用long数据类型来表示无符号的

  • 64 位long,其最小值为 0,最大值为 264-1。当您需要比int提供的范围更广的值范围时,请使用此数据类型。该Long类还包含诸如compareUnsigned()divideUnsigned()等方法,以支持无符号long的算术运算。

  • 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类的更多信息。

 

使用默认值初始化变量

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

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

数据类型 默认值(对于字段)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000
String(或任何对象) null
boolean false

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

 

使用字面量创建值

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

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

 

整数字面量

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

整数类型byteshortintlong的值可以从int字面量创建。超过int范围的long类型的值可以从long字面量创建。整数字面量可以通过以下数字系统表示

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

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

// The number 26, in decimal
int decimalValue = 26;

//  The number 26, in hexadecimal
int hexadecimalValue = 0x1a;

// The number 26, in binary
int binaryValue = 0b11010;

 

浮点字面量

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

浮点类型(floatdouble)也可以使用Ee(用于科学记数法)、Ff(32 位浮点字面量)和Dd(64 位双精度字面量;这是默认值,并且按照约定省略)来表示。

double d1 = 123.4;

// same value as d1, but in scientific notation
double d2 = 1.234e2;
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 组成;例如,String.class。它引用表示类型本身的对象,该对象的类型为 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;

您只能在下划线之间放置下划线;您不能在下划线以下位置放置下划线

  • 在数字的开头或结尾
  • 在浮点字面量的十进制点旁边
  • FL 后缀之前
  • 在需要数字字符串的位置

以下示例演示了数字字面量中下划线放置的有效和无效位置

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

上次更新: 2021 年 9 月 22 日


系列中的上一篇
当前教程
在程序中创建基本类型变量
系列中的下一篇

系列中的上一篇: 创建变量并命名它们

系列中的下一篇: 在程序中创建数组