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