@wxf
2017-04-30T11:46:43.000000Z
字数 2358
阅读 1093
老马说编程
上节我们说了数据类型和变量,通过声明变量,给每个变量赋予一个数据类型和一个有意义的名字,这样我们就告诉了计算机我们要操作的数据。有了数据,我们可以做很多操作,但本文只说对数据的赋值
操作。
在Java中基本数据类型、数组、对象的赋值有明显不同,本文将介绍基本类型和数组的赋值,关于对象赋值后面详述。
赋值形式很简单,直接把熟悉的数字常量赋值给变量即可,对应的内存空间的值就从未知变成了确定的常量。但是常量不能超过对应类型的表示范围。
整数类型包括:byte、short、int、long,它们分别占用1、2、4、8个字节的内存空间。
值得注意的是,在给long类型赋值时,如果常量超过了int的表示范围,需要在常量的后面加大写L和小写l,例如:
long a = 3232343433L;
这是由于整数常量默认是int类型的。
小数类型包括:float和double,它们分别占用4、8个字节的内存空间。
在对double进行赋值时,直接将数字常量赋值给变量即可,例如:
double d = 333.33;
但是对于float,需要在数字后面加大写F或小写f,例如:
float f = 333.33f;
这是由于小数常量默认是double类型的。
直接使用true和false进行赋值,分别表示真和假。
字符类型char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。在内存中,Java用两个字节表示一个字符
。赋值时把字符常量用单引号括起来,而不要使用双引号,例如:
char c = 'A';
char z = '中';
说明:
给变量赋值的形式包括:直接给变量赋值、变量赋值给变量、将变量的运算结果赋值给变量。
基本类型的数组有三种赋值形式,如下所示:
//1.预先知道数组内容
int[] arr = {1, 2, 3};
//2.预先知道数组内容
int[] arr = new int[]{1, 2, 3};
//3.先分配长度,再给每个元素赋值
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
在Java中定义的基本类型变量存在于栈内存中。但是对于数组这种复合数据结构,就需要将数组变量存在栈内存中,将数组对象存在堆内存中。然后通过引用变量来访问堆内存中的数据。
有一个int变量a,和一个int数组变量arr,其代码、变量对应的内存地址和内存内容如下:
代码 | 内存地址 | 内存数据 |
---|---|---|
int a = 100; | 1000 | 100 |
int[] arr = {1, 2, 3}; | 2000 | 3000 |
3000 | 1 | |
3004 | 2 | |
3008 | 3 |
基本类型a的内存地址是1000,这个位置存储的就是它的值100。数组类型arr的内存地址是2000,这个位置存储的值是一个堆内存地址值3000,3000开始的位置存储的才是实际的数据1, 2, 3。
Java中内存分为两种:栈内存和堆内存。
- 栈内存用来存放基本类型变量和对象的引用变量。
- 堆内存用来存放由
new
创建的对象和数组,以及对象的实例变量。
首先,我们先来看一下这段代码:
int[] arr1 = {1, 2, 3};
int[] arr2 = {4, 5, 6, 7};
arr1 = arr2;
这段代码中,arr1的初始长度是3,arr2的长度是4,后来将arr2赋值给arr1。如果arr1对应的内存空间是直接存储的数组内容,那么它将没有足够的空间去容纳arr2的所有元素。
当使用两块空间存储时,这个问题就简单多了。我们就可以将arr1的引用变量指向arr2的数组对象,从而完成数组赋值。而arr1的内存空间由于无人引用会被垃圾回收,如下:
由此,可以看出,给数组变量赋值和给数组中元素赋值时两回事。给数组中元素赋值是改变数字内容,而给数组变量赋值则是让变量指向一个内存空间。
数组一旦初始化完成后,其内存空间就已经分配结束,无法改变其长度,但是可以修改元素的值。可是数组又是一种引用类型的变量,它只是指向了内存中的数组对象。我们可以通过改变其引用,从而营造出一种长度可变的假象。
当定义了一个数组,为其赋值后就相当于定义了多个相同类型的变量。通过索引使用数组元素时,可将其作为普通变量使用。
class Cat{
double weight;
int age;
public Cat(double weight, int age){
this.weight = weight;
this.age = age;
}
}
public class ArrayTest{
public static void main(String[] args){
//定义,并动态初始化int数组
int[] pos = new int[5];
//循环为每个数组元素赋值
for(int i = 0; i < pos.length; i++){
pos[i] = (i + 1)*2;
}
int a = pos[1]; //将数组元素的值赋值给int变量
int b = 20;
pos[2] = b; //将int变量的值赋值给数组元素
//定义,并动态初始化一个Cat[]数组
Cat[] cats = new Cat[2];
cats[0] = new Cat(3.34, 2);
//将cats数组的第一个元素赋值给c1
Cat c1 = cat[0];
Cat c2 = new Cat(4.3, 3);
//将c2的值赋给cats数组的第2个元素
cats[1] = c2;
}
}
上述代码中,相关的内存分配示意图:
给变量赋予明确的值之后,变量可以被加载到CPU,CPU可以对这些值进行各种运算,运算后的结果又可以被赋值给变量,保存到内存中。那么数据可以进行哪些运算?又该如何进行数据运算呢?
参考资料: