Java学习整理笔记(三)数据类型

时间:2021-02-04 15:35:05

数据类型:

数据类型确定了数据在内存中占用的存储空间以及存储方式。每个数据类型都有它的取值范围,编译器根据每个变量或常量的数据类型为其分配内存空间。

Java语言的数据类型可以分为两类:一类是简单数据类型(或基本数据类型),例如整数类型、浮点数类型、字符型类型和布尔类型等;另一种是引用类型,例如数组类型、类、接口等。

一、基本数据类型

8种基本数据类型,分别是字节型(byte)、短整型(short)、整型(int)、长整型(long)、字符型(char)、浮点型(float)、双精度型(double)、布尔型(boolean)。

1.整数类型:

Java使用4种类型的整数:byet、short、int 和 long,都是有符号的整数。

(与有符号整数对应的是无符号整数,两者的区别在于把二进制数转换为十进制数的方式不一样。有符号数把二进制的首位作为符号位,当首位数是0时,对应十进制的正整数;当首位是1时,对应十进制的负整数。无符号整数在进行进制转换时,把二进制的所有位转化为正整数。)

注意:Java不支持仅仅是正的无符号的整数。

(1)字节型(byte):最小的整数类型。有符号的8位类型,数的范围是 -128~127。当从网络或文件处理数据流的时候,字节类型的变量特别有用。

声明字节变量: byte 变量名;

(2)短整型(short):有符号的16位类型,数的范围是 -32768~32767。因为它被定义为高字节优先(称为 big-endian格式),它可能是Java中使用的最好的类型。

声明短整型变量: short 变量名;

(3)整型(int):最常用的整数类型。有符号的32位类型,数的范围是 -2147 483 648~2147 483 647。int类型的变量通常被用来控制循环及作为数组的下标。

任何时候,如果整数表达式包含 byte、short、int及整型常量。在进行计算以前,所有表达式的类型被提升(自动转换)到整型。

声明整型变量: int 变量名;

(4)长整型(long):有符号的64位类型,它对于那些整型不足以保存所要求的数值时是有用的。长整型数的范围是相当大的。

声明长整型变量: long 变量名;

2.浮点型:

Java使用两种类型的浮点数:float和double。double型的存储空间是float型的两倍,所以double型又称为双精度,而float型又称为单精度。当数据或表达式的值有精度要求时,需要使用浮点型数据。

(1)单精度浮点型(float):专指占用32位存储空间的单精度值(Single-Precision)。单精度在一些处理器上比双精度更快而且只占用双精度一般的空间,但是当值很大或很小的时候,它将变得不精确。当需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。

声明单精度浮点型变量: float 变量名;

(2)双精度浮点型(double):占用64位的存储空间。所有超出人类经验的数学函数,如sin()、cos()和sqrt()均返回双精度的值。当需要保持多次返回迭代的计算的精确时,或在操作值很大的数字时,双精度型是最好的选择。

声明双精度浮点型变量: double 变量名;

3.字符型(char):

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平表示1和0)。将字符映射为它的二进制形式的过程称为编码(Encoding)。

为了能够实现互相通信而不造成混乱,就必须使用相同的编码规则或编码方式。当前使用最广泛的两种编码方式是 统一码(Unicode)和美国标准信息交换代码(ASCII)码。

在Java中,字符型数据用 char 关键字进行定义,采用Unicode码代表字符,使用16位数据表示字符集。

4.布尔型(boolean):

Java中表示逻辑值的简单类型。它的值只能是 true(真)或 false(假)这两个值中的一个。它是所有的诸如 a<b 这样的关系运算的返回类型。布尔类型对管理像 if、for这样的控制语句的条件表达式也是必需的。

 

二、定义常量

在程序运行过程中,其值不能改变的量称为常量。常量必须在同一条语句中声明和赋值,final是声明常量的Java关键字

程序中常量名所有字母最好用大写形式,词与词之间可以用下划线隔开。

Java中常用的常量有布尔型常量、整型常量、浮点型常量、字符常量和字符串常量。

1.布尔型常量:

布尔型常量用于表示两个逻辑状态之一的值:true(真)或false(假)。不同于C/C++语言,Java语言中规定不可将布尔型看成整型值。

注意:在Java语言中,true常量的值不等于1,false常量的值不等于0,它们仅仅能被赋给已定义的布尔变量,或在布尔运算符表达式中使用。

2.整型常量:

任何一个整数的值就是一个整数常量。整型常量可以用来给整型变量赋值。整型常量有3种表示形式:

(1)十进制整型常量:如 1,25,-37等。

(2)八进制整型常量:在Java语言中,以0开头的整型量表示八进制整型常量,如 010 表示十进制的 8 ,-015 表示十进制的 -13。

(3)十六进制整型常量:在Java语言中,以 0x 或 0X 开头的整型常量表示十六进制整型常量,如 0x10 表示十进制的 16 , -0X15 表示十进制的 -21 。

在Java语言中,整形常量的默认类型为int值,用4个字节表示。当一个整型常量的值被赋给一个 byte 或 short 型的变量时,如果常量的值没有超过对应类型的范围时不会产生错误。所以,整型常量总是可以被赋给一个long型变量。但是,如果要表示一个long类型的常量,则要特别指明,即通过在常量的后面加一个大写或小写的 L 来做到,如 1234567L 等。

3.浮点型常量:

浮点型常量是可以带有小数点的数值型常量。根据占用内存长度的不同,可以分为一般浮点常量和双精度常量。如果要表示一般浮点常量,可以在数值后面加上f或F;如果要表示双精度常量,可以在数值后面加上d和D。

注意:Java中的浮点型常量默认是双精度。

默认的双精度类型要占用64位存储空间,而精确低些的浮点类型仅仅需要32位。

4.字符常量:

Java用 Unicode字符集来表示字符。Java的字符是16位值,可以被转换为整数并可进行像加(+)或减(-)这样的整数运算。

在Java语言中,有以下两种形式的字符常量:

(1)普通字符:用单引号括起来的一个字符,如 'A'、'0'、'$'等。不能写成'AB'或'12'。

注意:单引号只是界限符,字符常量只能是一个字符,不包括单引号。'a'和'A'表示不同的字符常量。

(2)转义字符:以字符\ 开头的字符序列。这是一种在屏幕上无法显示的“控制字符”,在程序中也无法用一个一般形式的字符来表示,只能采用这样的特殊形式表示。

转义字符及其作用
转义字符 名称 Unicode 输出结果
\b 退格键 \u0008   将当前位置后退一个字符
\t  Tab键 \u0009   将当前位置移动到下一个Tab位置
\n 换行符号   \u0009A 将当前位置移动到下一行的开头 
\f 换页  \u000C   将当前位置移动到下一页的开头 
\r 回车键   \u000D  将当前位置移动到本行的开头 
\\ 反斜杠   \u005C  输出此字符 
\' 单引号   \u0027  输出此字符 
\" 双引号   \u0022  输出此字符 

 

 

5.字符串常量:

Java语言中用双引号("")括起来的字符序列表示字符串。字符串可以包含转义字符,标志字符串开始和结束的双引号必须在同一行。

可以使用连接操作符(+)将两个或多个字符串常量连接在一起组成一个新的字符串,例如 "Welcome"+"to China"的结果相当于"Welcome to China"。

注意:不能将 "ABC"错写为 'ABC'。单引号内只能包含一个字符,而双引号内可以包含一个字符串。另外,'A'和"A"表示两个不同的量,前者是一个字符常量,而后者是一个字符串常量。

在C/C++等大多数计算机语言中,字符串作为字符的数组被实现。然而,在Java中,字符串实际上是对象类型。

 

三、定义变量及其作用域

变量是Java程序的一个基本存储单元,表示内存中的一小块空间,用来存储将在程序中用到的数据。在内存中可以有很多个这样的小块空间,为了加以区分,为它们起不同的名字,这个名字就叫变量名,通常简称为变量。被称为变量是因为它们的值在程序执行中可以被改变。

变量名遵循标识符的定义规则,每个变量都有自己特定的类型,编译器可以根据变量的数据类型为变量分配合适的存储空间。

所有的变量都有一个作用域,定义变量的可见性与生存期。

1.定义变量:

在Java中,每个变量在使用之前必须先对其进行定义,即要遵循先定义后使用的原则。

定义变量的语法:

 

    数据类型 变量名[ = 初始值][,变量名 [ = 初始值]…];

 

数据类型可以是Java的基本类型之一,也可以是类及接口类型的名字。

变量名是用于标识该变量的名字,可以指定一个等号和一个值来初始化变量。

初始化表达式必须产生与指定的变量类型一样(或兼容)的变量。

声明指定类型的多个变量时,使用逗号将各变量分开。

例子:

int count;                    //声明 count为一个整型变量
double radius = 2.0;        //声明radius为一个double型变量,并赋初值为2.0
char ch = 'A';             //声明ch为字符类型的变量,并赋初值为字符'A'

2.变量初始化:

变量通常都有初始值。在Java中,可以在定义变量的同时对其初始化,也允许在变量声明时使用任何有效的表达式来动态的初始化变量。

初始化表达式可以使用任何有效的元素,包括方法调用、其他变量或字面量。

3.变量的作用域和生存期:

在Java语言中,每个变量都有一定的生存周期和有效范围。变量的作用域就是变量的有效范围,只有在这个范围内,程序代码才能访问它。

与C语言一样,Java用大括号将若干语句组成语句块,变量的作用域都是定义它的语句所在的语句块,一旦程序的执行离开了这个语句块,变量就变得没有意义,不能再使用了。

变量的生命周期是指从一个变量被创建并为其分配内存空间开始,到这个变量并销毁并清除所占用的内存空间的过程。变量的作用域决定了变量的生命周期。

Java允许在任何程序块定义变量。

按照作用域的不同,变量可以分为以下类型:

(1)成员变量:在类中声明,它的作用域是整个类。

(2)局部变量:在一个方法的内部或者方法的一个代码块的内部声明。如果在一个方法内部声明,它的作用域就是整个方法;如果在一个方法的某个代码块的内部声明,它的作用域就是这个代码块。

(3)方法参数:方法或者构造方法的参数,它的作用域是整个方法或者构造方法。

(4)异常处理参数:异常处理参数和方法参数很相似,差别在于前者是传递参数给异常处理代码块,而后者是传递参数给方法或者构造方法。异常处理参数是指 catch(Exception e)语句中的异常参数“e”,它的作用域是紧跟着catch(Exception e) 语句后的代码块。

(作为一个通用规则,在一个作用域中定义的变量对于该作用域外的程序是不可见(即访问)的。因此,当在一个作用域中定义一个变量时,应将该变量局部化并且保护它不被非授权访问和/或修改。实际上,作用域规则为封装提供了基础。)

 作用域可以进行嵌套。例如:每次创建一个程序块时,就创建了一个新的嵌套的作用域。这样,外面的作用域包含内部的作用域。这意味着外部作用域定义的对象对于内部作用域中的程序是可见的。但是,反过来是错误的,内部作用域定义的对象对于外部是不可见的。

例子:

class Scope{
    public static void main(String[] args){
        int x;      //定义局部变量x,在整个main()方法中有效
        x = 10;
        if(x==10){     //开始一个新的作用域
            int y = 20;    //定义局部变量y,在当前语句块中有效
            System.out.println("x and y:"+x+" "+y);    //x和y在这里均为有效
            x = y*2;
        }
        //y=100;     //错误,超出了y的作用范围
        x=15;      //正确,x在此处依然有效
        System.out.println("x is"+x);
    }
}    

 

还有,变量在其作用域被创建,离开其作用域时被撤销意味着一个变量一旦离开它的作用域,将不再保存它的值了。因此,一个变量的生存期就被限定在它的作用域中。如果一个变量定义包括一个初始化,那么每次进入定义它的程序块时,该变量都要被重新初始化。

尽管程序块能被嵌套,不能将内部作用域声明的变量与其外部作用域声明的变量重名。这一点,Java不同于C和C++。