我们在用编程解决问题的时候,绝大多数时刻不会仅仅是在屏幕上打印一句如“Hello World!”这样的话,或者是打印一个整数10,一个字符,一个小数。
相反,更多时候是在跟数据打交道,我们会使用数据,会操作数据、更改数据。比如每分钟定时使用最新的人民币兑美元汇率来计算总资产,可能会将部分数据的中间计算结果保存起来备用,类似的例子很多,这个时候我们编写代码可能就会使用到变量。
在程序中,对变量最直观的理解就是将其看作一个指向特定内存单元的标签。通过这个“标签”可以告知电脑需要其分配一定的内存用来存储数据,也可以通过这些标签来直接使用存储在内存单元里面的数据。关于变量的形象理解,就是将其看作一个个快递柜。当快递员需要存放快递时,他们就申请特定大小的柜子;类比,在编写代码时如果我们需要存放数据,我们就声明特定类型的变量。
和上一节教程一样,推荐大家创建一个新Java工程,不妨将其命名为“Variables-Demo”。接下来仍然是一边学习新概念,一边动手编写代码的这样一种学习方式。假设现在需要声明一个变量用来记录每天的出勤人数,可以像这样编写代码,
int students;
这行代码由两部分组成,最前面的单词“int”是Java中的类型标识符,表示常规整数类型。单词int也是Java这门编程语言的保留关键词。第二部分是我们给这个变量取的名字,可以将其类比于快递柜上的标签,通过这个名字可以直接来操作某个特定的内存单元。
当程序执行这行代码时,它会告知电脑在内存中分配一定的内存空间(这里是32个比特位),用来存储一个整数。如果这时需要使用这个变量来存储今天的出勤人数35,可以这样编写代码,
students = 35;
这里我们将整数35赋值给变量students。与大家常规意义上理解的等于号“=”不同,在Java里面这个符号表示赋值操作,因此这行代码表示将等于号右边的整数35赋值给左边的变量students,而不是表示“students = 35”这样一个等式。
程序在执行这行代码时,会告知电脑将数字35写入前面为变量students所分配的内存空间里面。我们可以使用println()来打印这个变量,
System.out.println(students)
运行这行代码时,我们的屏幕上会显式
35
这里println()的用法与我们前面打印“Hello World!”这句话,以及打印一个整数、一个浮点数的用法都不一样,这里用来打印一个变量。这行代码并没有在屏幕上显式“students”这个单词,而是打印出来了被保存在变量students背后的内存空间里面的整数35。在编程术语中,类似于整数35这样的常常叫做变量的值,有时候也直接简称值。比如Java程序员会这样说,“students的值为35”。
我们在使用变量前,必须为其赋予一个初始值,这个过程也叫做初始化一个变量,或者变量初始化。在没有特别说明的时候,初始化一个变量与变量初始化表示同一个意思,只是前者表示一个动作。
如果像这样编写代码
int students;
System.out.println(students);
很多Java编程软件会进行提示,比如IntelliJ IDEA会在println()所在的代码行里面对students进行标红,提示我们这个变量在使用前还没有被初始化。
此外,在Java中,声明一个变量以及对变量进行初始化可以同时进行,比如像下面这样编写代码,
int students = 35;
变量在第一次被赋予一个初始值后,如果有需要,我们可以更改变量的值。
students = 40;
System.out.println(students);
运行上面这段代码,我们的屏幕上会显式
40
这里我们第二次通过赋值操作,将另外一个整数40赋值给变量students。因此现在变量students的值变成了40。
如果在编写代码时,我们确定某个变量在被初始化后,不会再更改变量的值,这个时候可以使用Java里面的final关键词进行标识。
final double rate = 0.015;
上面这段代码在同一行里面同时声明了变量rate,以及进行变量初始化。这里的单词“double”也是类型标识符,表示双精度浮点类型。
也可以分两行代码完成这个过程,比如这样,
final double rate;
rate = 0.015;
无论采用哪种方式,一旦对这个被final关键词标识的变量进行第一次初始化后,就不能再次通过赋值操作更改变量的值,否则程序会出错。
使用同样的语法,我们可以很容易地声明其他类型的变量。如果想要声明一个变量用来保存一年中的某个月,可以这样编写代码
byte month = 12;
这里的单词“byte”也是Java的保留关键词,用来标识字节类型的整数。因为我们知道一年只有12个月,用字节类型表示最合适。大家还记得字节类型的整数可以表示-128到127这个范围的所有整数吗?
相反,如果想要声明一个变量保存一年当中的某一天,可以这样编写代码
short day = 365;
如果需要声明长整型变量,可以这样编写代码
long persons = 3000000000L;
这里前面的类型标识符“long”表示长整型,也是Java的保留关键词。对于单精度浮点型变量的声明,我们可以使用类型标识符“float”。
float speed = 120.56F;
这行代码声明了一个单精度浮点类型的变量speed,用来保存某个物体当前的时速。
对于字符类型和布尔类型,我们可以像这样编写代码,
char flag = '#';
boolean done = true;
在这里,单词“char”和“boolean”分别是字符类型和布尔类型的标识符,它们也是Java的保留关键词。
因此,声明一个变量的基本语法结构如下,
类型标识符 变量名称 = 变量初始值;
以下是本节教程的完整代码
public class VariablesDemo {
public static void main(String[] args) {
// int students;
// students = 35;
// System.out.println(students);
// int students;
// System.out.println(students);
int students = 35;
System.out.println(students);
students = 40;
System.out.println(students);
// final double rate = 0.015;
final double rate;
rate = 0.015;
// 错误用法
// rate = 0.025;
byte month = 12;
short day = 365;
long persons = 3000000000L; // 30亿
float speed = 120.56F;
char flag = '#';
boolean done = true;
}
}