程序
计算机是个机器,这个机器主要由CPU、内存、硬盘和输入/输出设备组成。从本质上讲,计算机只会执行预先写好的指令,这些指令也只是操作数据或者设备。所谓程序,基本上就是告诉计算机要操作的数据和执行的指令序列,即对什么数据做什么操作。基本上所有的数据都要放在内存里来处理,程序很大一部分工作就是操作在内存中的数据。这些数据在计算机内部都是二进制表示的,不方便操作,为了方便操作数据,高级语言引入了数据类型和变量的概念。
数据类型和变量
数据类型用于对数据归类,以便于理解和操作。对Java语言而言,有如下基本数据类型。
- 整数类型:有四种整形byte/short/int/long,分别有不同的取值范围
- 小数类型:有两种类型float/double,有不同的取值范围和精度
- 字符类型:char,表示单个字符
- 真假类型:boolean,表示真假
基本的数据类型都有对应的数组类型,数组表示固定长度的同种数据类型的多条记录,这些数据在内存中连续存放。
Java是面向对象的语言,除了基本数据类型,其他都是对象类型。对象是由基本数据类型、数组和其他对象组合而成的一个东西,以方便对其整体进行操作。世间万物都是由元素周期表中的基本元素组成的,基本的数据类型就相当于化学中的基本元素,而对象就相当于世间万物。
为了操作数据,需要把数据放到内存中。所谓内存在程序看来就是一块有地址编号的连续的空间,数据存放到内存中的某个位置后,为了方便的找到和操作这个数据,需要给这个位置起个名字。编程语言通过变量这个概念来表示这个过程。
声明一个变量,比如int a,其实就是在内存中分配了一块空间,这块空间存放int数据类型,a指向这块内存空间所在的位置,通过对a的操作即可操作a指向的内存空间,比如a = 5这个操作即可将a指向的内存空间的值改为5。之所以叫变量,是因为它表示的内存中的位置,这个位置存放的值是可以变化的。
变量就是给数据起名字(建议起一个有意义的名字),方便找不同的数据,它的值可以变,但含义不应变。
赋值
声明变量之后,就在内存分配了一块位置。但这个位置的内容是未知的,赋值就是把这块位置的内容设定成一个明确的值。Java中基本类型、数组、对象的赋值明显不同。
基本类型
(一)整数类型
整数类型有byte、short、int和long,分别占1、2、4、8个字节
赋值形式很简单,直接把熟悉的数字常量形式赋值给变量,对应的内存空间的值就从未知变成了确定的常量。但常量不能超过对应类型的取值范围。在给long类型赋值时,如果常量超过了int的表示范围,需要在常量后面加上大写或小写字母L,即L或l,例如:long a = 3232343433L,之所以需要加L或者l,是因为数字常量默认为是int类型。
(二)小数类型
小数类型有float和double,占用的内存空间分别是4和8字节,有不同的取值范围和精度,double表示的范围更大,精度更高。对于double,直接把熟悉的小数表示赋值给变量即可,但对于float,需要在数字后面加上大写字母F或者小写字母f。这是由于小数常量默认是double类型。除了小数,也可以把整数直接赋值给float或double。
(三)真假类型
真假类型很简单,直接使用true或者false赋值,分别表示真和假。
(四)字符类型
字符类型char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符,char占用的内存空间是两个字节。赋值是把常量字符用单引号括起来,不要使用双引号。例如:char a = ‘A’ char b = '贾’;
数组类型
基本类型的数组有3种赋值形式
第一种和第二种是预先知道数组的内容,而第三种是先分配长度,然后再给每个元素赋值。第三种形式中,即使没给每个元素赋值,每个元素也都有一个默认值,这个默认值跟数组类型有关,数值类型的值为0,boolean为false,char为空字符。
数组长度虽然可以动态确定,但定了之后就不可以改变。数组有一个length属性,但只能读不能改。还有个细节,不能再给定初始值的时候给定长度值。如下格式不允许:
可以这样理解,因为初始值已经确定了长度,再给定一个长度值,如果长度不同,计算机将无所适从。
数组类型和基本类型是有明显不同的,一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块:一块用于存储数组内容的本身,另一块用于存储数组内容的位置。示例如下:
基本类型a的内存地址是1000,这个位置存储的就是它的值100。数组类型arr的内存地址是2000,这个位置存储的是一个值位置3000,3000开始的位置存储的才是实际的数据。
为什么数组要用两块空间?
这段代码中,arrA初始长度是3,arrB的长度是4,后来将arrB的值赋给了arrA。如果arrA对应的内存空间直接存储的是数组内容,那么将没有足够的空间去容纳arrB所有的元素。用两块空间存储就简单的多,arrA存储的数组内容的位置值就和arrB一样,此后访问arrA和arrB都是一样的了,而arrA的内存空间由于不再被引用会进行垃圾回收。
由上可以看出,给数组变量赋值和给数组中元素赋值是两回事,给数组中元素赋值是改变数组内容,而给数组变量赋值是会让变量指向一个不同的位置。
给变量赋值就是将变量对应的内存空间设置为一个明确的值,有了值之后,变量可以被加载到CPU,CPU可以对这些值进行各种运算,运算后的结果又可以赋值给变量,保存到内存中。