1.2.1 变量的定义
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
定义变量的语法非常简单,只需要指定变量的类型和变量名即可,其语法格式如下:
变量类型 变量名[=初始值];
上述定义变量的语法中,变量类型决定了变量的数据性质、范围、存储在内存中所占的字节数以及可以进行的合法操作,变量名必须是一个合法的标识符,而[ ]中的内容是可选项,即在定义变量的同时,可以对该变量进行初始化赋值。
接下来,通过具体的代码来学习变量的定义:
int x=0,y;
Y=x+3;
上述代码中,第一行代码的作用是定义了两个 int 类型的变量 x和 y,也就相当于分配了两块内存单元,在定义变量的同时为变量 x分配了一个初始值 0,而变量y没有分配初始值,变量x 和 y 在内存中的状态如图 1-1 所示。
第二行代码的作用是为变量y赋值,在执行第二行代码时,程序首先从内存中取出变量x 的值,然后与 3 相加后,最后将结果赋值给变量y,此时变量×和y在内存中的状态发生了变化,如图 1-2 所示。
1.2.2 变量的数据类型
Java 是一门强类型的编程语言,它对变量的数据类型有严格的限定。在定义变量时必须先声明变量的数据类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序在编译期间就会出现类型匹配错误的问题。
在Java 中变量的数据类型分为两种:基本数据类型和引用数据类型。Java 中所有的数据类型如下图 所示。
其中,8 种基本数据类型是 Java 语言内嵌的,在任何操作系统中都具有相同大小和属性,而引用数据类型是在Java程序中由编程人员自己定义的数据类型。
1.整数类型变量
整数类型变量用来存储整数数值,即没有小数部分的值。在 Java 中,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为 4 种不同的类型:字节型(byte)、短整型(short)、整型(int)和长整型(long),4 种类型所占存储空间的大小以及取值范围如表 2-2所示。
表 2-2 中,列出了4种整数类型变量所占的空间大小和取值范围。其中,占用空间指的是不同类型的变量分别占用的内存大小,如一个 int 类型的变量会占用 4 个字节大小的内存空间。取值范围是变量存储的值不能超出的范围,如一个 byte 类型的变量存储的值必须是-~
-1之间的整数。
类型名 | 占用空间 | 取值范围 |
byte(字节型) | 5位(1个字节) | -![]() ![]() |
short(短整型) | 16位(2个字节) | -![]() ![]() |
int(整型) | 32位(4个字节) | -![]() ![]() |
long(长整型) | 64位(8个字节) | -![]() ![]() |
在为一个long类型的变量赋值时需要注意一点,所赋值的后面要加上一个字母L(或小写l),说明赋值为long类型。如果赋的值未超出int型的取值范围,则可以省略字母L(或小写l)。具体示例如下:
long num=2200000000L; //所赋的值超出了int型的取值范围,后面必须加上L
long num=198L; //所赋的值未超出int型的取值范围,后面可以加上L
long num=198; //所赋的值未超出int型的取值范围,后面可以省略L
2.浮点数类型变量
浮点数类型变量用来存储小数数值。在 Java 中,浮点数类型分为两种:单精度浮点数(float)和双精度浮点数(double)。double 型所表示的浮点数比 float 型更精确,两种浮点数所占存储空间的大小以及取值范围如表所示。
类型名 | 占用空间 | 取值范围 |
float | 32位(4个字节 ) | 1.4E-45~3.4E+38,-1.4E-45~-3.4E+38 |
double | 64位(8个字节) | 4.9E-324~1.7E+308,-4.9E-324~-1.7E+308 |
表中,列出了两种浮点数类型变量所占的空间大小和取值范围,在取值范围中,E表示以 10 为底的指数,E 后面的(十)号和(一)号代表正指数和负指数,例如 1.4E— 45 表示1.4 *。
在Java中,一个小数会被默认为 double 类型的值,因此在为一个 float 类型的变量赋值时,所赋值的后面一定要加上字母 F(或者小写 f),而为 double 类型的变量赋值时,可以在所赋值的后面加上字符 D(或小写 d),也可以不加。具体示例如下:
float f=123.4f; //为一个float类型的变量赋值,后面必须加上字母F或f
double d1=199.3d //为一个double类型的变量赋值,后面可以加上字母D或d
double d2=100.1; //为一个double类型的变量赋值,后面可以省略字母D或d
在程序中也可以为一个浮点数类型变量赋予一个整数数值,例如下面写法是可以的
float f=100; //声明一个float类型的变量并赋整数值
double d=100; //声明一个double类型的变量并赋整数值
3.字符类型变量
字符类型变量用于存储一个单一字符,在 Java 中用 char 表示。Java 中每个 char 类型的字符变量都会占用 2 个字节。在给 char 类型的变量赋值时,需要用一对英文半角格式的单引号' '把字符括起来.如'a',也可以将 char 类型的变量赋值为 0~65535 范围内的整数,计算机会自动将这些整数转化为所对应的字符,如数值 97 对应的字符为' a'。下面的两行代码可以实现同样的效果。
char c='a'; //为一个char类型的变量赋值字符'a'
char ch=97; //为一个char类型的变量赋值整数97,相当于赋值字符'a'
4.布尔类型变量
布尔类型变量用来储存布尔值,在Java中用boolean表示,该类型的变量只有两个值,即turn和false。具体示例如下:
boolean flag=false; //声明一个boolean类型的变量,初始值为false
flag=true; //改变flag变量的值为true
1.2.3 变量的类型转换
在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。
1、自动类型转换
自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量时,系统就会进行自动类型转换,否则需要进行强制类型转换。
Java中的自动类型转换就好比将小瓶中的水倒人到大瓶的换装过程。我们将小瓶水倒入到大瓶中时,由于小瓶的容量比大瓶的容量小,所以倒人的水永远不可能溢出大瓶。同样,在Java 中,将取值范围小的数据类型的变量值赋值给取值范围大的数据类型的变量时,程序也不会出现任何问题。
Java 中支持的不同数据类型之间的自动转换如图所示。
2.强制类型转换
强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要显式地声明。当两种类型不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。将取值范围大的数据类型的变量赋值 给取值范围小的数据类型的变量时就可能造成数据丢失,所以系统默认不支持这种行为,只能由开发者自己决定是否进行强制类型转换。
接下来是错误的类型转换的例子:
public class 类名{
public static void main(String[] args){
int num=4;
byte b=num;
System.out.println(b);
}
}
此时运行会报错。
这种情况下,就需要进行强制类型转换,其语法格式如下:
目标类型 变量名 =(目标类型)值;
将上面代码的第四行修改为下面的代码:
byte b=(byte) num;
其运行结果为 4
1.2.4变量的作用域
在前面介绍过变量需要先定义后使用,但这并不意味着在变量定义后的语句中一定可以使用该变量。变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域。接下来通过一个代码片段来分析变量的作用域,具体示例如下:
public static void main(String[] args){ /*
int x=4; *
{ *
int y=9; /* *
. * *
. * y的作用域 *
. * * x的作用域
} */ *
. *
. *
. *
} */
1.2.5Java中的常量
常量就是在程序中固定不变的值,是不能改变的数据。例如数字 1、字符'a'、浮点数 3.2等。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。接下来就对这些常量进行详细讲解。
1.整型常量
整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制 4 种表示形式,具体说明如下。
1.二进制:由数字 0 和1组成的数字序列。在 JDK 7 以后,允许使用二进制字面值来表示整数,此时二进制数值前面要以 0b 或 0B 开头,目的是为了和十进制进行区分,如0b01101100,0B10110101。
2.八进制:以 0 开头并且其后由 0一7(包括 0 和 7)的整数组成的数字序列,如 0342。
3.十进制:由数字 0~9(包括 0 和 9)的整数组成的数字序列,如 198。
4.十六进制:
④十六进制:以0x 或者 0X 开头,并且其后由 0~9、A~F(包括 0 和 9.A 和 F)组成的字符序列,如 0x25AF。
需要注意的是,在程序中为了标明不同的进制,数据都有特定的标识,八进制必须以 0开头,如 0711,0123;十六进制必须以 0x 或 0X 开头,如 0xaf3,0Xff;整数以十进制表示时,第一位不能是 0,0 本身除外。例如十进制的 127,用二进制表示为 01111111,用八进制表示为 0177,用十六进制表示为 0x7F 或者 0X7F。
2.浮点数常量
浮点数常量就是在数学中用到的小数,分为 float 单精度浮点数和 double 双精度浮点数两种类型。其中,单精度浮点数后面以F或f结尾,而双精度浮点数则以 D或d结尾。当然,在使用浮点数时也可以在结尾处不加任何后缀,此时Java虚拟机会将浮点数默认识别为 double 双精度浮点数。浮点数常量还可以通过指数形式来表示。具体示例如下:
2e3f 3.6d 0f 3.84d 5.022e+23f
3.字符常量
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号' '引起来,它可以是英文字母、数字、标点符号以及由转义序列来表示的特殊字符。具体示例如下:
'a' '1' '&' '\r'
4.字符串常量
字符串常量用来表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号” “引起来,具体示例如下:
"HelloWorld" "123" "Welcome \n xxx" ""
一个字符串常量可以包含一个字符或多个字符也可以不包含任何一个字符,即长度为0。
5.布尔常量
布尔常量即布尔类型的两个值true和false,该常量用于区分一个条件的真假。
6.null常量
null 常量只有一个值 null,表示对象的引用为空。
而Java 中的常量,其实就是特殊的变量,是固定不变的量,有且只能进行一次赋值。Java 中定义常量的语法非常简单,只需要在定义变量的语法基础上加上一个 final 关键字修饰即可,其语法格式如下:
final 常量类型 常量名 [=初始值];
上述定义Java常量的语法格式与定义Java变量的语法格式基本相同。唯一不同的是,定义Java常量时必须用final关键字修饰,声明是一个不可改变的量。其具体示例如下:
final int a=0 ,b; //定义一个int类型的常量a和b,并为常量a初始化赋值0
b=1; //后续为常量b赋值