编程大讲坛:Java核心开发技术从入门到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3课 数据类型和量

Java数据类型、变量和常量,三者之间是息息相关的,变量和常量是离不开数据类型的。在编程的过程中,程序工作者必定会确定在程序中出现的变量和常量为什么数据类型,只有这样,Java才能正常利用这些变量或常量去实现一些功能,本章将重点讲解Java的数据类型、变量和常量。

3.1 本课学习目标

在本课的内容中,将详细讲解Java数据类型、变量和常量,本课的具体学习目标如下:

● Java的基本数据类型。

● 简单数据类型。

● Java标识符。

● 变量。

● 常量。

● 数据类型优先级。

3.2 Java的基本数据类型

Java数据类型分为简单数据类型和复杂数据类型。简单数据类型是Java的基础类型,它包括整数类型、浮点类型、字符类型和布尔类型,本课将重点讲解。复杂数据类型是由简单数据类型组成的,是用户根据自己的需要定义并实现其运算的类型,如类、接口、数组,后面将一一讲解。

简单数据类型主要有byte、short、int、long、char、float、double和boolean,简单数据类型所占的内存位数及取值范围如表3-1所示。

表3-1 数据类型

3.2.1 整型

整型是Java常用的数据类型,它是有符号的32位整数数据类型,整型int用在数组、控制语句等多个地方,Java系统会把byte和short自动提升为整型int。

3.2.2 浮点类型

浮点类型是相对整型的数据类型,用来表示Java中的浮点数,浮点类型数据表示有小数部分的数字,总共有两种类型组成:单精度浮点型(float)和双精度浮点型(double),下面对其进行讲解。

1.单精度浮点型

单精度浮点型是指占用32位存储空间的单精度数据类型,在编程的过程中,当需要小数部分且对精度要求不高时,一般使用单精度浮点型,这种数据类型很少用,不进行详细讲解。

2.双精度浮点型

双精度浮点类型占用类型64位存储空间,双精度浮点型在计算中占有很大的比重,双精度浮点型保证数值的准确型,如下面代码是计算圆的面积,代码如下:

            public class DoubleText
            {
              public static void main(String args[])
              {
                  double r=45985.0324;
                  final double PI=3.1415926;
                  double area=PI*r*r;
                  System.out.println("圆的面积是:S="+area);
              }
            }

用户可以根据前面的讲解的方法,启动Eclipse,将代码输入,进行编译与运行,得到如图3-1所示的结果。

图3-1 执行后的结果

TIPS

在上面的程序中,出现了“*”、“=”符号,它们是运算符,第一个符号相当于数学中的乘号,第二个是赋值符号,并不是数学中的等号,这些知识点在第4章中将会对其进行详细的讲解。

3.2.3 字符类型

在Java程序中,存储字符的数据类型是数据类型,用字母char表示,下面展示一个代码,用户看完代码后,再进行讲解,代码如下:

            public class CharText
            {
              public static void main(String args[])
              {
                  char ch1='\u0001';
                  char ch2='\u0394';
                  char ch3='\uffff';
                  System.out.println(ch1);
                  System.out.println(ch2);
                  System.out.println(ch3);
              }
            }

将代码输入到Eclipse后,然后执行,运行结果如图3-2所示。

图3-2 执行后的结果

这是怎么回事?怎么会出现这样的形状呢?这是因为使用Unicode码表示的结果,Unicode所定义的国际化字符集能表示今天为止的所有字符集,如拉丁文、希腊语等几十种语言,这些大部分是看不懂的,用户不需要掌握。读者请注意,在执行的结果处有一个问号,它有可能是真的问号,也有可能是不能显示的符号。但是为了正常的输出这些符号,该怎么处理?Java提供了转义字符,以“\”开头,十六进制计数法用“\”和“U”字开头,后面跟着十六进制数字,常用的转义字符如表3-2所示。

表3-2 转义字符

有的是需要输出转义字符,这时候就需要将转义字符前面加一个“\”,如下面代码:

            public class Tan
            {
              public static void main(String args[])
              {
                  System.out.println("tanjie\\wangtao");
              }
            }

执行结果如图3-3所示。

图3-3 转义字符的输出结果

实例探索和读者练习:

在上面的程序中,主要讲解了如何在程序中输出一些特殊字符,学过这个方法后,建议读者要记住如图3-3所示的转义字符的方法。

读者自行练习一些字符的显示,下面将给出一个程序,显示一些转义字符,根据前面所学的知识判断,它将会输出什么内容。

                public class Tan1 {
                    public static void main(String args[])
                {
                    System.out.println("beijing\\shanghai");
                    System.out.println("beijing\'shanghai");
                    System.out.println("beijing\"shanghai");
                    System.out.println("beijing\rshanghai");
                }
                }

3.2.4 布尔类型

布尔类型是Java数据用来判别正确与错误的一种数据类型,布尔类型是一个逻辑值,布尔类型只有两个数据,那就是true和flase,如下面代码:

            public class BooleanText
            {
              public static void main(String args[])
              {
                  int tan=6+1;
                  boolean bn=(tan==6);
                  System.out.println(bn);
              }
            }

这段代码执行的结果是:false,如图3-4所示,判断出“tan”这个值等于6是错误的。

图3-4 布尔类型

实例探索和读者练习:

布尔类型实际上就是一个判断的语句,只要条件符合,它将会给出答案是true,如果条件不符合要求,它将给出答案flase。

下面将给出一个程序,读者来判断,它将会输出什么样的答案,其代码如下:

                public class BooleanText1
                {
                    public static void main(String args[])
                    {
          int tan=1;
          boolean bn=(tan<9);
          System.out.println(bn);
                    }
                }

3.3 Java标识符

标识符是赋给类、方法或变量的名称,在Java语言中,用标识符来识别类名、变量名、方法名、类型名、数组名和文件名。

Java语言开头规定,标识符由大小写字母、数字、下画线(_)、美元符号($)组成,但不能以数字开头,标识符没有最大长度限制,下面都是合法的标识符。

            Chongqin_$   D3Tf   T_w_o   $67.55

如何判断标识符合不合法,下面进行详细介绍。

● 标识符不能以数字开头,如7788。

● 在标识符中不能出现规定以外的字符,如You’are、deng@qq.com。

标识符是严格区分大小写的,在Java中,no和No是完全不同的,还需要注意的是虽然使用$符号在语法上是被允许的,但在编码规范中规定尽量不要使用它,因为它容易混淆。

3.4 Java关键字

关键字是Java系统保留使用的标识符,也就是说只有Java系统才能使用,程序员不能使用这样的标识符,关键字是Java中特殊保留字,到目前为止,Java语言保留的关键字如表3-3所示。

表3-3 Java关键字

从表中可以看出true、flase和null,它们是Java所定义的特殊值,虽然他们不是关键字,但也不能使用词作为类名、方法名和变量名等。

3.5 量

在Java中,量分为常量和变量,下面对其进行详细讲解。

3.5.1 常量

常量也就是常数,其值不能改变,它们可以是不随时间变化的某些量和信息,也可以是表示某一数值的字符或字符串,在Java程序中,常量名常用大写字母表示,value是该数据合法的值,如下面代码就是常量的格式。

            final double PI=value;

3.5.2 变量

变量就是在程序的运行中可以变化的量,非常重要,在Java程序设计中,每个声明的变量都必须分配一个类型,不管在什么样的程序设计中,都会提到,在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量,为了操作方便,给这个空间取了个名字,称为变量名,内存空间内的值就是变量值,所以,申请了内存空间,变量不一定有值,要想变量有值,就必须要放入值,但申请的变量,不同的数据类型,它们将会有一个默认值,如int的数据变量的默认值是0,char的数据类型的变量是null,byte的数据变量的默认是0。

在程序运行中,变量的基本格式与常量有所不同,变量的基本格式是:

            typeSpencifier varName=vlaue;

typeSpencifier为Java中合法的数据类型,这和常量是一样的,varName为变量名,变量和常量的最大的区别是vlaue的值可有可无,而且还可以对其进行动态初始化。

变量分为局部变量和全局变量,全局变量也称做成员变量,在变量被定义在一个类中,在所有的方法和函数之外,局部变量在一个方法或者一个函数中。

1.局部变量

实例1:通过上面的讲解,用户可以看出,变量在程序中是随时可以改变的,随时都在传递着数据,下面通过一个实例进一步讲解局部变量的作用,其代码如下:

            public class Area
            {
              public static void main(String args[])
              {
                  //正方形面积
                  double a1=7.2;
                  double s1=a1*a1;
                  System.out.println("正方形的面积为"+s1);
                  //长方形面积
                  double a2=3.1,b2=2.3;
                  double s2=a2*b2;
                  System.out.println("长方形的面积为"+s2);
                  //三角形面积
                  double a3=4.0,b3=7.0;
                  double s3=a3*b3/2;
                  System.out.println("三角形的面积为"+s3);
              }
            }

将代码进行执行,将会得到如图3-5所示的结果。

图3-5 局部变量

在上面的代码中,s1、s2和s3都是动态初始化的,同时在程序初始化程序中还给出了a1、a2、b2、a3和b3。

实例探索和读者练习:

布局变量,顾名思义,就是在一个方法块或者一个函数内起作用,超过这个范围,它将没有任何作用,下面给出一个程序,读者指出局部变量,并指出它的作用域,其代码如下:

                public class Area1
                {
                    int a1=7;
                    int s1=a1*a1;
                    public static void main(String args[])
                    {
      //长方形面积
          double a2=7.1,b2=4.3;
          double s2=a2*b2;
          System.out.println("长方形的面积为"+s2);
      //三角形面积
          double a3=5.2,b3=6.7;
          double s3=a3*b3/2;
          System.out.println("三角形的面积为"+s3);
                    }
                }

2.全局变量

实例2:通过实例1 的讲解,用户已经明白局部变量,下面通过一个实例进一步讲解全局变量及其作用,其代码如下:

            public class var
            {
                byte x;
                short y;
                int z;
                int z1;
                long a;
                float b;
                double c;
                char d;
                boolean e;
                public static void main(String[] args)
                {
                    int z1=111;
                    System.out.println(" 打印数据z="+z1);
                    var m=new var();
                    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);
                }
            }

全局变量将对这个程序产生作用,但是局部可以随时更改这个变量的值,在上面的程序里,定义了两个int z1;在局部中将重新定义这个变量,在这个局部中变量的值将会发生改变,将上面的程序运行,在这里定义了byte变量“x”、short变量“y”、int变量 “z”和“z1”、float变量“b”、double变量“c”、 char变量“d”、“boolean”变量e,都未赋予值,但是在执行的时候都出现的值,,这说明,不管什么类型的变量,都有默认值,未给变量定义值,它将以默认值产生,值得提醒的是,char变量“d”默认值是空,所以它将以空白显示,程序执行完得到如图3-6所示的结果。

图3-6 全局变量

实例探索和读者练习:

全局变量就是使用相同的内存块在整个类中存储一个值,只要在类的“{”、“}”中的变量都将起作用。

3.6 数据类型的转换

在实际的开发中,会遇到两种不同类型数据之间的计算,如char a与int c相加,这时候就需要使用类型转换。在Java中,有时两种数据类型可以兼容,例如一个byte d数据可以赋值给一个int h数据,int h数据再将它传给long j数据,在这一个过程中,Java就能实现自动数据类型的转换,否则Java就得进行强制转换,下面对自动数据类型的转换与强制数据类型的转换进行详细讲解。

3.6.1 自动类型转换

在Java程序中,数据类型自动转换,只需要满足一个条件,两个数据类型兼容和目标数据类型要大于原型数据类型,如整数和浮点数这两种数字类型,数据之间是兼容的,数字类型和布尔类型是兼容的,而字符类型和布尔数据不兼容,这些怎么理解,下面通过一个实例来讲解。

实例3:通过实例,用户将会清楚地看到一些数据相加后执行的结果,其代码如下:

            public class Text
            {
              public static void main(String args[])
              {
                  byte a=17;
                  short b=12;
                  int c=6;
                  float d=3.0f;
                  double e=9.0;
                  System.out.println(a+b);
                  System.out.println(b+c);
                  System.out.println(d+e);
                  System.out.println(a+b+c+d+e);
              }
            }

将代码输入完了,然后进行编译执行,得到如图3-7所示的结果。

图3-7 自动数据类型转换

这些数据是兼容的,从运行的结果就可以看出,接下来看一段不兼容的代码,其代码如下:

            public class TextTwo
            {
              public static void main(String args[])
              {
                  int a=17;
                  boolean b=true;
                  char c='e';
                  System.out.println(a+b);
                  System.out.println(b+c);
              }
            }

输入完成后,编译将会出现不兼容的提示,执行后得到如图3-8所示的结果。

图3-8 报错结果

根据错误提示,用户知道数据类型不兼容,整点型、浮点型、字符型可以根据混合运算,在Java定义中,程序在运行不同类型的计算时,要先将不同类型的数据类型转换为同一类型,然后再进行计算,如表3-4所示,左边的数据可以向右边的转换。

表3-4 不同类型转换规则

上面讲解了不同类型的转换规则,下面讲解一个代码,其代码如下:

            public class TextThree {
                  public static void main(String args[])
                  {
        char a='A';
        int b=2;
        System.out.println(a+b);
                  }
              }

初学者一定很奇怪,A可以加2,但执行后,得到这个结果会更让你惊讶,如图3-9所示。

图3-9 自动类型转换的规则

得到这个结果跟前面实例3讲解的一样,字符型数据可以整形数据表示,从表中也可看得出,他们的兼容性。

实例探索和读者练习:

不同的数据类型是可以进行计算的,只要满足一定的条件,Java程序将会自动转换其数据类型,然后计算。

下面给出一段程序,里面有两种不同的数据类型,进行相加后,结果是什么,读者根据程序给出答案,其程序代码如下:

                public class duzhe {
          public static void main(String args[])
          {
double a=45.03;
int b=72;
System.out.println(a+b);
          }
                    }

3.6.2 强制类型转换

也许人们心中有疑问,如果将一个int型转的值赋给一个byte,这时候该怎么处理,这种转换不会自动进行,需要byte的取值范围要小于int,要实现这个赋值,需要强制转换,强制转换类型的格式为:

           (target-type)value

实例4:通过一个实例,Target-type指定了要指定值所转换类型,看看是怎样把int型强制转换成byte型的。

            public class TextFour
            {
              public static void main(String args[])
              {
                  int a=586;
                  byte b=(byte)a;
                  System.out.println(a);
                  System.out.println(b);
              }
            }

运行代码,得到如图3-10所示的结果。

图3-10 类型的转换

看到这个结果,用户会很惊讶,为什么b的值是74呢?因为b的值超过byte的取值范围,它的值得将会因为对byte型的值域而减小,它的值是这个数除以byte的取值个数(-128~127)所得到的余数。

实例5:当浮点型赋给整数类型时,它的小数部分就将会被舍去,如果浮点型舍去小数还不在其取值范围内,它将采用上面的整除取余数的方法,代码如下:

            public class TextFire
            {
              public static void main(String args[])
              {
                  double a=3.234;
                    double b=676.294;
                    byte c=(byte)a;
                    System.out.println(c);
                    byte d=(byte)b;
                    System.out.println(d);
              }
              }

执行后,将会得到如图3-11所示的结果。

图3-11 强制转换后的结果

3.7 本课回顾和网络关键词

在本课的内容中,首先,简要介绍了Java数据类型、变量和常量基础性知识和Java标识符、Java关键字、Java中的量;然后,详细讲解了Java数据类型的转换。在本节的内容中,将对本课中的主要知识点进行简要回顾,并总结出本课知识点的网络关键词。

1.本课回顾

在本课的内容中,主要讲解了Java数据类型、常量和变量及数据类型转换的基本知识。回顾本课内容,主要的知识点概括如下。

(1)Java的基本数据类型。

Java是一种面向对象的、可视化的编程语言,其主要知识点如下。

● 整型。

● 浮点类型。

● 字符类型。

● 布尔类型。

(2)量。

量分为常量和变量,主要知识点如下。

● 常量。

● 变量。

(3)Java标识符号。

(4)Java关键字。

(5)数据类型的转换包括自动类型的转换和强制类型的转换。

2.本课网络关键词

在下面的内容中,将对本课中的主要知识点进行收集整理,总结出本课知识点的网络关键词。

本课知识点的网络关键词有:“整型”、“浮点类型”、“布尔类型”、“Java标识符”、“常量”、“变量”、“Java关键字”。

通过整理上述网络关键词,读者可以在百度、Google或Yahoo中获取上述关键词的基本知识。有的关键词还可以继续细分并且可以获取每个知识点的对应使用实例,读者可以通过获取的实例来加深对知识的理解。

希望通过本课内容的学习,读者不但能够掌握Java的数据类型和量的基本知识,对其有一个初步的认识,为进入本书后面知识的学习打下坚实的基础。