1.变量的定义
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
定义变量的语法非常简单,只需要指定变量的类型和变量名即可,其语法格式如下:
变量类型 变量名 【=初识值】 ;
上述定义变量的语法中,变量类型决定了变量的数据性质、范围、存储在内存中所占的字节数以及可以进行的合法操作,变量名必须是一个合法的标识符,而[ ]中的内容是可选项,即在定义变量的同时,可以对该变量进行初始化赋值。
接下来,通过具体的代码来学习变量的定义:
int x=0,y;
y=x+3;
上述代码中,第一行代码的作用是定义了两个int类型的变量x和y,也就相当于分配了两块内存单元,在定义变量的同时为变量x分配了一个初始值0,而变量y没有分配初始值,变量x和y在内存中的状态如图1-1所示。
第二行代码的作用是为变量y赋值,在执行第二行代码时,程序首先从内存中取出变量x的值,然后与3相加后,最后将结果赋值给变量y,此时变量x和y在内存中的状态发生了变化,如图1-2所示。
图1-1 图1-2
2.变量的数据类型
Java是一门强类型的编程语言,它对变量的数据类型有严格的限定。在定义变量时必须先声明变量的数据类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序在编译期间就会出现类型匹配错误的问题。
在Java中变量的数据类型分为两种:基本数据类型和引用数据类型。Java中所有的数据类型如图2-3所示。
其中,8种基本数据类型是Java语言内嵌的,在任何操作系统中都具有相同大小和属性,而引用数据类型是在Java程序中由编程人员自己定义的数据类型。
3.变量类型的转换
在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。
1.自动类型转换
自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量时,系统就会进行自动类型转换,否则需要进行强制类型转换。
Java中的自动类型转换就好比将小瓶中的水倒人到大瓶的换装过程。我们将小瓶水倒人到大瓶中时,由于小瓶的容量比大瓶的容量小,所以倒人的水永远不可能溢出大瓶。同样,在Java中,将取值范围小的数据类型的变量值赋值给取值范围大的数据类型的变量时,程序也不会出现任何问题。
Java中支持的不同数据类型之间的自动转换如图2一4所示。
从图2一4可以看出,Java中取值范围小的byte、short、char等类型数据都可以自动转换为取值范围大的数据类型(如int类型),并最终都可以自动转换为双精度浮点数类型。
2.强制类型转换
强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要显式地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。
Java中的强制类型转换就好比将大瓶中的水倒人到小瓶中一样,如果大瓶中的水的容量小于小瓶的容量,那么水是可以完全倒人的;如果大瓶水过多,其容量超过了小瓶的容量,那么多出来的水就会溢出,从而造成损失。同理,将取值范围大的数据类型的变量值赋值给取值范围小的数据类型的变量时,就可能造成数据的丢失,所以系统默认不支持这种行为,只能由开发者自己决定是否进行强制类型转换。
强制类型转换的语法格式如下:
目标类型 变量名 = (目标类型)值;
例如:
public class Test {
public static void main (String[] args){
byte a;
int b = 298;
a = (byte) b; //强制类型转换
Sytem.out.println("b="+b);
Sytem.out.println("a="+a);
}
}
运行结果:
b=298
a=42
第5行代码进行了强制类型转换,将一个int类型的变量b强制转换成byte 类型,然后再将强转后的结果赋值给byte类型的变量a。从运行结果可以看出,变量b本身的值为298,然而在赋值给变量a后,变量a的值却为42,这说明在强制转换过程中丢失了精度。出现这种现象的原因是,变量b为int类型,在内 int 存中占用4个字节,而byte类型的数据在内存中占用1个字节。当将变量b的类型强转为byte类型后,前面3个高位字节的数据已经丢失,这样数值就发生了改变。
4.变量类型的作用域
在前面介绍过变量需要先定义后使用,但这并不意味着在变量定义后的语句中一定可以使用该变量。变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域。接下来通过一个代码片段来分析变量的作用域,具体示例如下:
上面的代码中,有两层大括号。其中,外层大括号所标识的代码区域就是变量x的作用域,内层大括号所标识的代码区域就是变量y的作用域。
小试牛刀
1.试问:byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
答案见下期尾部!
上期答案:
1.
/*
_(\_/)
,((((^`\
(((( (6 \
,((((( , \
,,,_ ,((((( /"._ ,`,
((((\\ ,... ,(((( / `-.-'
))) ;' `"'"'""(((( (
((( / ((( \
)) | |
(( | . ' |
)) \ _ ' `t ,.')
( | y;- -,-""'"-.\ \/
) / ./ ) / `\ \
|./ ( ( / /'
|| \\ //'|
|| \\ _//'||
|| )) |_/ ||
\_\ |_/ ||
`'" \_\
`'"
*/
2.
print(' ─────────▄──────────────▄──── \n', \
' ─ wow ──▌▒█───────────▄▀▒▌─── \n', \
' ────────▌▒▒▀▄───────▄▀▒▒▒▐─── \n', \
' ───────▐▄▀▒▒▀▀▀▀▄▄▄▀▒▒▒▒▒▐─── \n', \
' ─────▄▄▀▒▒▒▒▒▒▒▒▒▒▒█▒▒▄█▒▐─── \n', \
' ───▄▀▒▒▒▒▒▒ such difference ─ \n', \
'──▐▒▒▒▄▄▄▒▒▒▒▒▒▒▒▒▒▒▒▒▀▄▒▒▌── \n', \
' ──▌▒▒▐▄█▀▒▒▒▒▄▀█▄▒▒▒▒▒▒▒█▒▐── \n', \
' ─▐▒▒▒▒▒▒▒▒▒▒▒▌██▀▒▒▒▒▒▒▒▒▀▄▌─ \n', \
' ─▌▒▀▄██▄▒▒▒▒▒▒▒▒▒▒▒░░░░▒▒▒▒▌─ \n', \
' ─▌▀▐▄█▄█▌▄▒▀▒▒▒▒▒▒░░░░░░▒▒▒▐─ \n', \
'▐▒▀▐▀▐▀▒▒▄▄▒▄▒▒▒ electrons ▒▌ \n', \
'▐▒▒▒▀▀▄▄▒▒▒▄▒▒▒▒▒▒░░░░░░▒▒▒▐─ \n', \
' ─▌▒▒▒▒▒▒▀▀▀▒▒▒▒▒▒▒▒░░░░▒▒▒▒▌─ \n', \
' ─▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▐── \n', \
' ──▀ amaze ▒▒▒▒▒▒▒▒▒▒▒▄▒▒▒▒▌── \n', \
'────▀▄▒▒▒▒▒▒▒▒▒▒▄▄▄▀▒▒▒▒▄▀─── \n', \
' ───▐▀▒▀▄▄▄▄▄▄▀▀▀▒▒▒▒▒▄▄▀───── \n', \
' ──▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▀▀──────── \n'
)