3.1 常量和变量
量是用来传递数据的介质,有着十分重要的作用。Java语言中的量既可以是变化的,也可以是固定不变的。根据是否可变,可以将Java中的量分为变量和常量。在接下来的内容中,将详细讲解Java语言中变量和常量的基本知识。
知识点讲解:
3.1.1 常量
永远不变的量就是常量,常量的值不会随着时间的变化而发生改变,在程序中通常用来表示某一固定值的字符或字符串。在Java程序中,我们经常会用大写字母来表示常量名,具体格式如下。
final double PI=value;
在上述代码中,PI是常量的名称,value是常量的值。
实例3-1
定义几个Java常量
源码路径:daima\3\ding.java
实例文件ding.java的主要实现代码如下所示。
public class ding { //下面开始定义各种数据类型的常量 public final double PI = 3.1415926; public final int Aa = 24; public final int Bb = 36; public final int Cc = 48; public final int Dd = 60; public final String Str1="hello"; public final String Str2="aa"; public final String Str3="bb"; public final String Str4="cc"; public final String Str5="dd"; public final String Str6="ee"; public final String Str7="ff"; public final String Str8="gg"; public final String Str9="hh"; public final String Str10="ii"; public final Boolean Mm=true; public final Boolean Nn=false; }
拓展范例及视频二维码
范例3-1-01:定义并操作常量
源码路径:演练范例\3-1-01\
范例3-1-02:输出错误信息和调试信息
源码路径:演练范例\3-1-02\
在上述代码中,我们分别定义了不同类型的常量,既有double类型,也有int类型;既有String类型,也有Boolean类型。
在Java中,常量也称为直接量,直接量是指在程序中通过源代码直接指定的值,例如在int a=5这行代码中,我们为变量a分配的初始值5就是一个直接量。
并不是所有数据类型都可以指定给直接量,能指定直接量的通常只有3种类型—基本类型、字符串类型和null类型。具体来说,Java支持如下8种数据类型的直接量。
❑ int类型的直接量:在程序中直接给出的整型数值,可分为十进制、八进制和十六进制3种,其中八进制需要以0开头,十六进制需要以0x或0X开头。例如123、012(对应十进制的10)、0x12(对应十进制的18)等。
❑ long类型的直接量:整数数值在后面添加l(字母)或L后就变成了long类型的直接量,例如3L、0x12L(对应十进制的18L)。
❑ float类型的直接量:浮点数在后面添加f或F就成了float类型的直接量,浮点数既可以是标准小数形式,也可以是科学记数法形式。例如5.34F、3.14E5f。
❑ double类型的直接量:直接给出标准小数形式或科学记数法形式的浮点数就是double类型的直接量。例如5.34、3.14E5。
❑ boolean类型的直接量:这种类型的直接量只有两个——true和false。
❑ char类型的直接量:char类型的直接量有3种形式,分别是用单引号括起的字符、转义字符以及用Unicode值表示的字符。例如’a'、'\n’和’\u0061'。
❑ String类型的直接量:用双引号括起来的字符序列就是String类型的直接量。
❑ null类型的直接量:这种类型的直接量只有一个——null。
在上面的8种类型中,null类型是一种特殊类型,只有一个直接量null,而且这个直接量可以赋给任何引用类型的变量,用于表示这个引用类型的变量中保存的地址为空,即还未指向任何有效对象。
注意:有关数据类型的详细知识,将在本章后面的内容中进行讲解。
3.1.2 变量
在Java程序中,变量是指在程序运行过程中其值会随时发生变化的量。在声明变量时必须为其分配一种类型,在程序运行过程中,变量的内存空间中的值是发生变化的,这个内存空间就是变量的实体。为了操作方便,给这个内存空间取了个名字,称为变量名。因为内存空间中的值就是变量值,所以即使申请了内存空间,变量也不一定有值。要让变量有值,就必须先放入一个值。在申请变量的时候,无论是什么样的数据类型,它们都会有默认值,例如int数据变量的默认值是“0”,char数据变量的默认值是null,byte数据变量的默认值是“0”。
在Java程序中,声明变量的基本格式与声明常量有所不同,具体格式如下所示。
typeSpencifier varName=value;
❑ typeSpencifier:可以是Java语言中所有合法的数据类型,这和常量是一样的。
❑ varName:变量名,变量和常量的最大区别在于value的值可有可无,而且还可以对其进行动态初始化。
Java中的变量分为局部变量和全局变量两种,具体说明如下所示。
1.局部变量
顾名思义,局部变量就是在一个方法块或一个函数内起作用,超出这个范围,局部变量将没有任何作用。由此可以看出,变量在程序中是随时可以改变的,随时都在传递着数据。
实例3-2
用变量计算三角形、正方形和长方形的面积
源码路径:daima\3\PassTest.java
实例文件PassTest.java的主要实现代码如下所示。
public static void main(String args[]){ //计算三角形面积 ① int a3=12, b3=34; //赋值a3和b3 ② int s3=a3*b3/2; //面积公式 //输出结果 ③ System.out.println("三角形的面积为"+s3); //计算正方形面积 ④ double a1=12.2; //赋值a1 ⑤ double s1=a1*a1; //面积公式 //输出结果 ⑥ System.out.println("正方形的面积为"+s1); //计算长方形面积 ⑦ double a2=388.1, b2=332.3; //赋值a2和b2 ⑧ double s2=a2*b2; //面积公式 ⑨ System.out.println("长方形的面积为"+s2); //输出结果 }
拓展范例及视频二维码
范例3-2-01:计算长方形和三角形的面积
源码路径:演练范例\3-2-01\
范例3-2-02:从控制台接收输入字符
源码路径:演练范例\3-2-02\
行①②定义两个int类型变量a3和b3并赋值,设置变量s3的值是a3乘以b3,然后除以2。
行③⑥⑨分别使用println()函数输出变量s3、s1和s2的值。
行④⑤分别定义两个double类型的变量a1和s1,设置a1的初始值是12.2,设置s1的值是a1的平方。
行⑦分别定义两个double类型的变量a2和b2,设置a2的初始值是388.1,设置b2的初始值是332.3。
行⑧定义一个double类型的变量s2,并设置其初始值是a2乘以b2。
执行后的结果如图3-1所示。
图3-1 执行结果
2.全局变量
明白局部变量后就不难理解全局变量了,其实全局变量就是作用区域比局部变量的作用区域更大的变量,能在整个程序内起作用。
实例3-3
输出设置的变量值
源码路径:daima\3\Quan.java
实例文件Quan.java的主要实现代码如下所示。
public class Quan { //下面分别定义变量x、y、z、z1、a、b、c、d、e byte x; short y; //定义变量y int z; //定义变量z int z1; //定义变量z1 long a; //定义变量a float b; //定义变量b double c; //定义变量c char d; //定义变量d boolean e; //定义变量e //下面设置z1的值, 并分别输出x、y、z、a、b、c、d、e的值 public static void main(String[] args){ int z1=111; //给z1赋值 System.out.println("打印数据z="+z1); //下面开始分别输出数据 Quan m=new Quan(); //定义对象m System.out.println("打印数据x="+m.x); System.out.println("打印数据y="+m.y); System.out.println("打印数据z="+m.z); System.out.println("打印数据a="+m.a); System.out.println("打印数据b="+m.b); System.out.println("打印数据c="+m.c); System.out.println("打印数据d="+m.d); System.out.println("打印数据e="+m.e); } }
拓展范例及视频二维码
范例3-3-01:演示局部变量的影响
源码路径:演练范例\3-3-01\
范例3-3-02:重定向输出流以实现程序日志
源码路径:演练范例\3-3-02\
在上述实例代码中,全局变量将对整个程序产生作用,但是在局部可以随时更改全局变量的值。在上面的程序里,定义了全局变量z1;在局部对这个变量重新赋值,这个变量的值将会发生改变。运行上面的程序,在这里定义了byte变量“x”、short变量y、int变量z和z1、float变量b、double变量c、char变量d、Boolean变量e,它们都未赋予初始值,但是在执行的时候它们都有了值。这说明不管什么类型的变量,都有默认值。如果未给变量定义初始值,系统将赋予默认值,执行后的结果如图3-2所示。
图3-2 执行结果
在面对变量的作用域问题时,一定要确保知道变量要先定义,然后才能使用,但也不是说,变量定义后的语句一直都能使用前面定义的变量。我们可以用大括号将多条语句包裹起来形成一条复合语句,变量只能在定义它的复合语句中使用。例如在下面的演示代码中,前面定义变量x的值是12,而在后面的嵌套中又想重新对变量x进行定义并赋值,这在Java语言中是不允许的。
源码路径:daima\3\TestScope.java
public class TestScope{ public static void main(String[] args) { int x = 12; //{ int q = 96; // x和q都可用 int x = 3; //错误的定义, Java中不允许有这种嵌套定义,因为前面已经定义了变量x System.out.println("x is "+x); System.out.println("q is "+q); //} q = x; System.out.println("x is "+x); } }
要想解决上述问题,只需要删除重复的对变量x的赋值定义,然后删除嵌套的大括号即可。例如下面的代码就是正确的:
public class TestScope{ public static void main(String[] args) { int x = 12; int q = 96; // x和q都可用 System.out.println("x is "+x); System.out.println("q is "+q); q = x; System.out.println("x is "+x); } }