01_basic_04_data_type_and_variable

第四章 数据类型与变量

1 Java数据类型

Java语言支持两种数据类型:基本数据类型(Primitive Data Types)引用类型(Reference Types)。基本数据类型包括整数类型(Integral Types)、浮点数类型(Floating-Point Types)和布尔类型(Boolean Type)。其中,整数类型和浮点数类型合称为数值类型(Numeric Types)。引用类型是指向接口对象或者类对象的数据类型。

Java语言支持的基本数据类型如下所示。

类型描述取值范围
byte单字节有符号整数(8-bit signed integer)[-128, 127]
char双字节无符号整数,以表示UTF-16编码的字符 (16-bit unsigned integer representing UTF-16 code units)['\u0000', '\uffff']
short双字节有符号整数(16-bit signed integer)[-32768, 32767]
int四字节有符号整数(32-bit signed integer)[-2147483648, 2147483647]
long八字节有符号整数(64-bit signed integer)[-9223372036854775808, 9223372036854775807]
float四字节单精度浮点数(32-bit IEEE 754 floating-point number) 
double八字节双精度浮点数(64-bit IEEE 754 floating-point number) 
boolean布尔值true 或者 false

我们将会在介绍类和对象的时候再介绍引用类型。

2 标识符(Identifier)

标识符是由字符和数字组成的"名字"。在Java程序中,标识符用来表示变量、对象、类、接口、方法等元素或者对象。一个合法的标识符必须由字符开头,并紧接着一个或者多个字符或者数字。在这里,字符包括大写A-Z、小写a-z的英文字符,美元符号$以及下划线字符_。数字包括0-9的数字字符。

Java语言允许任意长度的标识符,但是标识符的第一个字符必须是上述的字符。标识符不能与Java关键字相同,也不能是布尔字面常量(true或者false)或者空字符常量(null)。

我们在下面例举了一些合法的Java标识符。

i     j3     _internal    MAX_VALUE      isLetterOrDigit

3 变量(Variable)

在Java程序中,变量是存放数据的地方。它与数学领域中使用的变量x和y非常相似。但是,Java程序为每个变量都设置了类型,即一种类型的变量只能存放相同类型的数值。例如,一个int类型的变量只能存放一个四字节有符号整数。

在下面的例子中,我们定义了两个变量x和y。x是一个int类型的变量,值为1。y是一个单精度浮点型的变量,值为2.0。

int x = 1;
float j = 2.0f;

使用变量完成简单的计算是非常方便的。假如我们需要计算x2+2x+1的值。那么,在数学上,我们常用的办法是建立一个数学公式y=x2+2x+1。当x=1时,我们能很快的计算出y的值是4。类似的,我们也可以使用这种方法,让程序帮我们计算y的值。在下面的两行代码中,我们首先将变量x的值设置为1。然后,再通过简单的计算,将结果赋值给变量y。这样,变量y就保存了计算所得的结果。在下一章中,我们将会介绍操作府+和*的用法。在Java语言中,加法使用+符号表示,乘法使用*符号表示。

int x = 1;
int y = x * x + 2 * x + 1;

在变量定义的同时,为变量设置一个初始值的过程被称为变量初始化。在变量初始化之后,我们还能修改变量的值。这个修改变量的值的过程被称为变量赋值。所以,当我们需要再次计算x=2时的值时,我们可以做如下处理。

int x = 1;
int y = x * x + 2 * x + 1;

// 当x=2时,我们可以将新值赋值给变量x和y
x = 2;
y = x * x + 2 * x + 1;

基本类型变量的使用方法非常相似。但是,有以下几点不同之处。其一,布尔类型boolean只有两个值,true或者false。其二,下面程序中使用了字面常量(Literal),例如true, 1, 1.0F等。在默认情况下,整形字面常量的默认类型是int。如果需要使用long类型的字面常量的话,需要在常量最后添加字符"l"或者"L",例如:1L。类似的,浮点类型的字面常量的默认类型是double。如果需要初始化单精度浮点数类型的话,需要在字面常量最后添加字符"f"或者"F"。

boolean b = true;  // 布尔值只有两个值true和false
short s = 1;
int i = 1;
long l = 1L;
float = 1.0F;
double = 1.0;
char c = 'c';

如果在变量创建时,没有设置初始值的话,Java语言会为其设置一个默认值。数值类型变量的默认值是0。布尔类型变量的默认值是false。char类型变量的默认值是'\u0000'。引用类型变量的默认值是null。

4 字面常量(Literal)

整数类型的字面常量可以使用十进制、十六进制、八进制或者二进制表示。当使用十六进制、八进制或者二进制时,需要在字面常量添加前缀"0x"、"0"、或者"0b"。当字面常量较长时,还可以使用下划线(_)分隔字面常量,提供更好的代码可读性。下划线不改变字面常量的值。下面列出了几种字面常量,它们表示的是相同的值。

int i1 = 11259375;
int i2 = 11_259_375;
int i3 = 0xABCDEF;
int i4 = 0xAB_CD_EF;
int i5 = 052746757;
int i6 = 052_746_757;
int i7 = 0b101010111100110111101111;
int i8 = 0b1010_1011_1100_1101_1110_1111;

浮点数的字面常量可是使用十进制或者十六进制表示。浮点数字面常量还支持科学计数法。如下的几种浮点数字面常量表示的是相同的值。

double d1 = 3.1415926;
double d2 = 3.141_592_6;
double d3 = 0x1.921FB4D12D849D891263p1; // 后缀p1表示乘以2的一次方,类似于科学计数法
double d4 = 0x1.92_1F_B4_D1_2D_84_9D_89_12_63p1; 
double d5 = 3.1415926e1; // = 3.1415926 x 10的一次方

布尔类型的字面常量只有true和false两个值。

boolean b1 = true;
boolean b2 = false;

字符类型的字面常量是由一对单引号和一个字符组成的。当需要表示单引号字符或者一些特殊意义的字符时,需要使用转义字符(Escaped Character)

char c1 = 'a';   // 表示单个字符a
char c2 = '\'';  // 表示单个单引号字符
char c3 = '\t';  // 表示单个制表符

字符串字面常量是由一对双引号和一串字符组成的。类似的,字符串中的特殊字符需要使用转义字符表示。当字符串中没有字符时,我们称之为空字符串

String emptyString = "";  // 这是一个空字符串
String aSentence = "This is a string.";

当我们在后续章节中介绍对象引用变量时,会常常使用空引用字面常量null。它表示该变量没有引用任何对象。

String aNullStringVariable = null;

5 常量

如果当我们定义变量时,发现变量在初始化之后,不需要改变其值。那么,我们可以使用关键字final,告诉Java编译器,这是一个"常量"。在后续处理中,程序不会修改这个变量的值。如果修改了,请报告错误。常量的名称一般由大写字母和数字表示。

final double PI = 3.1415926;

6 var与类型自动推演

var是一种受限的标识符(Restricted Identifier),它不是关键字。var可以用来声明变量;在声明变量时,开发人员无需明确指出变量的类型,Java编译器会自动的推演变量的类型。如果Java编译器无法推演变量类型的话,Java编译器会报告错误。

使用var能够帮助提升开发效率,因为开发人员无需写出冗长的类型名称。例如,下面都是合法的使用var的例子。var的一个常见的使用场景是在for循环中声明局部变量。

int[] a = {1, 2, 3};
var sum = 0;
for (var e: a) {
    sum += e;
}

但是,var的使用也是有限制的。var不能用于以下任何一种场景。使用var时,

  1. 不能在一行中声明多个变量。
var a = 1, b = 2; // 错误
  1. 变量名称不能使用方括号。
var d[] = new int[4]; // 错误,当d为数组时,应使用var d = new int[4];
  1. 变量必须同时完成初始化。不能先声明,之后初始化。
var d; // 错误,Java编译器无法推演变量类型
  1. 不支持数组初始化(ArrayInitializer)。
var e = { 6 };  // 错误,目前Java语言不支持这种数组初始化
  1. 初始化时,不能使用自身变量。
var f = (f = 7); // 错误,初始化时不能使用自身变量

7 结语

本章介绍了Java语言的变量类型以及基本数据类型变量的初始化和赋值。基本数据类型变量的使用方法非常相似。在每一种数据类型中,Java语言支持字面常量和变量。在变量定义时,如果使用了关键字final的话,则该变量在初始化后,其值是不变的。不能在程序的后续处理中修改该变量的值。我们会在讲解类和对象时介绍Java的另一种数据类型:对象引用类型。

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.