Java 开发从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

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);
            }
        }