Java语言GUI程序设计
上QQ阅读APP看书,第一时间看更新

3.1 Java的关键字、数据类型、常量与变量

关键字、数据类型、常量与变量是Java语言最基本的几个概念,也是组成Java程序的最小结构元素。

3.1.1 关键字

Java语言中规定了一些单词和字符串,作为Java程序中的命令词或指示符,Java编译器会根据它们产生有关操作代码或程序结构,它们是Java语言的关键字。例如,class就是关键字,指示编译器随后所定义的一段代码是一个Java类。

关键字只有50个,大多数是英文单词、单词片段或单词组合,列举如下。

虽然true、false和null从技术上讲并不是关键字,但是它们在Java语言中也有特定的含义和用法。这三个词汇及关键字在NetBeans IDE的源代码视图中都使用蓝色显示。此外,Java 9保留下画线字符“_”。Java语言关键字及保留字不能用作类名、方法名、变量名和常量名。从Java 9开始,open、module、requires、transitive、exports、opens、to、uses、provides和with只是在模块声明中才是关键字。Java 10中var是保留字。

3.1.2 Java的基本数据类型

Java语言对程序处理的代表现实世界各种信息的数据也表示为高层次的概念——不同的数据类型。Java语言有两类数据类型:基本数据类型和引用数据类型。前面接触到的类(class)就是Java语言中最主要的引用数据类型,此外还有后面要介绍的接口(interface)、枚举和数组三种引用数据类型。

基本数据类型是Java语言定义的一些简单数据类型,是进行Java程序设计时频繁使用且结构简单的类型,是用以完成程序中最“基本”最“主要”计算的“主”(Primitive)类型。基本数据类型的具体量不需要用new创建,一旦定义这种类型的量,就可以高效地存取,并可以直接参与运算。

Java语言决定了每种基本数据类型的大小,这些大小并不随着机器结构的变化而变化。基本数据类型的大小不可更改是Java程序具有很强移植能力的原因之一。表3.1列出了Java语言基本数据类型。

表3.1 Java语言基本数据类型

表3.1中byte、short和void三种类型在Java 1.0版中是没有的,到了Java 1.1才加入;boolean和void类型的数据没有大小,其余类型的数据都有大小之分,因而称为数值类型。数值类型的数据都是有符号(正负号)的数。

每种基本数据类型都有自己的“封装器”(wrapper)类,通过封装器类提供了对应类型数据的大量实用方法。自Java 5开始,基本数据类型的数据与其封装器类对象可以自动进行相互转换。

此外,Java 1.1增加了两个类用于进行高精度计算:BigInteger和BigDecimal,且两者都没有对应的“主类型”。这两个类都有自己的特殊方法,对应于针对主类型执行的操作。也就是说,能对int或float做的事情,对BigInteger和BigDecimal一样可以做,但是必须使用方法调用,不能使用运算符,且运算速度会慢一些。BigInteger支持任意精度的整数。也就是说,我们可精确表示任意大小的整数值,同时在运算过程中不会丢失任何信息。BigDecimal支持任意精度的定点数字。例如,可用它进行精确的币值计算。

3.1.3 常量

常量是存储在程序中不能被修改的固定值,程序运行过程中一直保持这个固定值不变。例如,计算圆的面积和周长时要用到的圆周率的值就必须保持不变,圆周率在这个程序中就是常量。

对应于Java的基本数据类型,有各种类型的常量。

1. 整型常量

整型常量就是程序中直接使用的一些整数。例如,计算圆周长时半径的2倍,其中,这个2就是整型常量。

程序中可以使用十进制、八进制和十六进制整型常量,负整数前面加“−”号。十进制常量用非0(零)的数值表示,如−12,360,32 768等,0也是十进制整数;八进制常量以数字0开头,后面跟着由0~7组成的数字,例如−0172,030等;十六进制常量以0X或0x开头,后面跟着由0~9、A~F(大小写相同,如a和A都是表示十进制值10)组成的数字,例如-0x17f,0X3B0等。Java 7还允许增加0B或0b前缀来表示二进制整型常量,如0b10101111。

整型常量对应于基本数据类型的int和long类型。int型整型常量在内存中占用4字节。如果希望使用占用8字节的整数,可以使用对应于long类型的长整型常量,在数字后面加字母L即可,例如,1L将占用64位存储空间。小写l也可以表示长整型常量,但与数字1不易分辨,一般还是使用大写L。

2. 浮点型常量

带有小数的表示数值的常量即是浮点型常量,对应于float和double基本数据类型。

float类型的常量在数值后加字母f或F,且这个字符不能省略。例如,3.1416F、1.0F、0.0F等。这种常量在内存中使用4字节存放。

double类型的常量在数值后加字母d或D,但这个字符可以省略,且不带后缀字母的浮点型常量默认就是double类型。例如,0.0D,2.1d、3.1416等。double类型的常量在内存中使用8字节存放。

浮点型常量也可以采用科学计数法,其中,10的整数次方采用“e整数或E整数”形式。例如,4.12e−2表示4.12 x 10−2,8.927E6D表示8.927 x 10+6

3. 布尔型常量

布尔型常量也称为逻辑型常量,表示逻辑断言的真假结果。表示断言结果为真的布尔型常量值是true,表示断言结果为假的布尔型常量值是false。

在Java GUI程序的可视化设计中,常用布尔常量表示可以转换的两种状态。例如,对于文本字段组件的editable属性,设置为true(属性值列的复选框中打对勾)表示用户可以编辑其中的文字,设置为false(属性值列的复选框中没有打对勾)表示用户不能编辑其中的文字,像前面的简单加法计算器程序对显示相加结果文本字段组件的editable属性值列取消打勾,则生成语句“jTextFieldResult.setEditable(false);”,给setEditable方法传递逻辑常量值false;对于窗体组件的resizable属性,设置为true表示用户可以改变窗口大小,设置为false表示用户不能改变窗口大小;对于按钮组件的enabled属性,设置为true表示可以对用户的单击动作进行响应,设置为false表示不会响应用户的单击动作。

4. 字符型常量

字符型常量是表示单个英文字母、一个汉字或其他语言的单个字符,也就是Unicode字符集中的一个字符,用单引号“’”引起来。例如,‘C’、‘8’、‘言’、‘▲’等。

Unicode字符集是由Unicode Consortium机构(一个非盈利机构)制定的字符编码系统,为世界上每种语言的每个字符都设定了统一且唯一的二进制编码,以满足跨平台、跨语言进行文本转换、处理的需求。Unicode支持Unicode-8、Unicode-16和Unicode-32三种编码方案,都能够表示超过65 000个不同字符的编码。Java语言中的字符型常量还可以采用单引号引起来的Unicode编码表示,如‘u0061’,‘u005a’等。在有些IDE中输入了汉字之后可能看到这种表示形式。

还有一类具有特殊含义且很难用一般方式表示的字符,称为转义字符,如换行、回车、退格字符等。Java语言明确规定了转义字符(见表3.2),它们都是在单引号内以反斜线“\”开头的表示形式。

表3.2 常用的转义字符

5. 字符串常量

字符串常量是用双引号(")引起来的字符序列,在Java GUI程序的可视化设计过程中使用十分频繁。例如,2.5节介绍的组件的text属性、窗体的title属性等目前都是使用字符串常量设置的,如简单计算器项目的源程序中的语句“jLabel1.setText("第一个数:");”等给setText方法传递字符串常量"第一个数:"。

在字符串常量中可以使用转义字符,例如Java语句“jLabel1.setText("欢迎使用用户登录程序,\n输入正确的用户名和密码就可以进入系统。");”将在字符‘\n’处换行分两行显示文本。如果看不到两行内容,选择该标签组件后,光标放到下边框中间调控柄上向下拖动,增加高度即可。

字符串常量的实际类型是java.lang.String类,有大量的实用方法可以对字符串进行各种操作,将在以后章节详细介绍。

Java GUI程序中经常会通过文本字段等组件返回字符串,并且需要将字符串转换为其他类型的数值。这种转换使用目标类型包装器类的parseXxx方法完成,这些方法主要是:

     Integer.parseInt(String);
     Long.parseLong (String);
     Float.parseFloat(String);
     Double.parseDouble(String);

例如,图2.12简单的加法计算器程序第120和121行的语句:

     double num1 = Double.parseDouble(jTextFieldNum1.getText());
     double num2 = Double.parseDouble(jTextFieldNum2.getText());

首先调用组件的getText()方法得到文本字段组件中用户输入的字符串,然后使用double类型的包装器类Double的parseDouble方法转换为double类型。

6. 常量标识符

可以为常量定义一个标识符,以方便对其使用。使用Java语言关键字final进行定义,格式是:

     final 类型 标识符=常量值;

其中,类型可以是上述任何一种基本类型;标识符命名规则与类名的相同,习惯上全部字母使用大写字母;常量值则受类型限定。以下是几个例子:

     final double PI=3.1416D;
     final int MAX=1024;
     final boolean SELECTED=true;

使用常量标识符代替常量值可以使程序更容易阅读和维护,例如,在有关圆的程序中见到PI就容易想到是圆周率π,如果需要精确到小数点后6位,则只需修改常量标识符PI(final double PI=3.141593D;)即可,不必在每个用到π的语句中都进行修改。

3.1.4 变量

通常,开发程序的目的是为某一类或某一种问题给出一个通用的使用计算机解决的方案,即便是最简单的程序基本也是如此。例如,2.1节设计的简单加法计算器程序,其中的加数和被加数可以是用户输入的任何合法值,能够计算无数对数值的和。显然,其中的加数和被加数是变化的量,而不是常量。这种在程序运行过程中值可以变化的量,在Java语言程序中称为变量。

1. 变量声明

Java程序中的变量使用之前必须进行声明。声明变量的格式如下:

(1)类型变量名1,变量名2,…;或者:

(2)类型变量名1=初始值,变量名2=初始值,…;

其中,类型规定变量可以存放和使用的数据的类型,可以是基本类型或引用类型。变量名符合标识符命名规则;习惯上字母使用小写,如果用多个单词组合,第一个单词首字母小写,其余单词首字母大写。可以在声明变量的同时指定变量初值,初值类型应该与变量声明的类型相同或相容(如整数值与声明为double类型的变量相容)。

例如,以下是几个变量声明语句:

     int age;
     float salaryOfMonth;
     java.lang.String name;
2. 变量初始化

使用格式(2)声明变量,则在变量声明的同时进行了初始化,变量获得了一个值。

Java语言规定,变量使用之前必须初始化。对于类中属性变量(也称为域变量、域、字段变量、字段),如果定义时没有初始化,则编译器会采用默认值初始化它们。其中,boolean类型默认初值为false、char为'\u0000'、int为0、long为0L、float为0.0f、double为0.0d、引用类型变量默认初值为null。

例如,图2.12简单的加法计算器程序第120~122行的语句:

     double num1 = Double.parseDouble(jTextFieldNum1.getText());
     double num2 = Double.parseDouble(jTextFieldNum2.getText());
     double result = num1+num2;

分别声明了三个double类型变量num1、num2和result,且num1被初始化为接收用户输入的第一个数的文本框中的内容转换为double型的浮点数,num2进行类似初始化,num3初始化为num1与num2之和。显然,一个变量可以使用另外一些变量进行初始化。又如:

     java.lang.String name="Java语言GUI程序设计" ;

使用字符串常量初始化了String类型的name变量。

Java程序中变量的初值保存到变量值改变时为止。

3. 变量的理解

变量是程序中用来存储数据的。实际上,程序中的数据在运行过程中是存储在内存中的,因此程序中的变量必然与内存相联系。对于基本数据类型,变量就是为存储数据的那块内存取的名字,使用这个变量就是使用那块内存。对于类等引用数据类型,变量是存放对象引用的内存块名字;在使用new操作符创建类的一个对象时,会为该对象分配一块内存区域,同时返回该对象所使用的这块内存区的引用(可以理解为地址),而这个引用值可以存放到用该类定义的引用变量中。

3.1.5 使用JShell练习

在JDK 9发布之前编写一个Java程序,必须使用一个编辑-编译-执行循环,无法简单地直接执行Java语句,使初学者上手困难,也使调试Java程序部分代码的工作显得有些烦琐。JDK 9中引入了一种交互式访问Java编程语言的工具和API——JShell(Java Shell),为初学者提供了一种快速探索Java编程语言的方法;给有经验的开发人员提供了一种快速的方式来查看代码段的结果,而无须编译和运行整个程序;它还提供了一种使用增量方法快速开发原型的方法,即添加一段代码,获取即时反馈,并添加另一个代码片段,直到原型完成。

JShell位于JDK 9安装目录下的bin子目录中,在Windows的命令提示符窗口中输入JShell(如果出现错误,将当前目录转到其所在的目录),回车之后如果出现,就启动了JShell进入到Java的交互式执行环境中。如果在NetBeans IDE中,单击“工具”|菜单项,则会在“编辑”窗口中新增一个选项卡,“输出”窗口中出现面板(见图3.1)。

图3.1 NetBeans IDE中JShell窗口

在JShell下直接输入Java语句(但不用输入语句后的分号)就可以得到执行结果,例如,输入4e-2回车之后JShell直接显示结果$1 ==> 0.04(见图3.2)。如果输入的语句有错误,则会显示错误和警告信息(见图3.2),从而帮助初学者理解和纠偏。要退出JShell,只需在之后输入“/exit”命令即可。在JShell中执行的Java语句称为程序片,/list命令可列出所有片段。

图3.2 Windows命令行窗口中的JShell界面