---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
数组的特点
(1) 只能存储同一类型数据
(2) 一旦初始化长度固定
(3) 数组的每个元素会有对应初始值
数组是一种单独的数据类型。数据类型分为2大派,分为基本数据类型和引用数据类型。 第二大派是引用数据类型。那么大家现在已经接触到了引用数据类型三种当中的一种。就是数组类型[] 中括号就代表数组。
总结:数组是属于引用数据类型
数组的初始化方式:
静态初始化:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
动态初始化:元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
示例:int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
执行以下代码,内存中发生了什么事
int[] arr = new int[3]
int[] arr2 = arr;
arr2[0] = 10;
内存分析图:
栈内存的特点
(1) 存储的都是局部变量,栈内存也成为方法栈,因为方法运行的时候会在栈内存中开辟属于自己的空间
堆内存的特点
(1) 存储的都是对象数据,凡事以new关键字创建的对象,都会存储在堆内存中,
(2) 在堆内存中分的对象的属性,都有默认的初始值
(3) 数组的默认初始化值根据数组的类型而定;
(4) int类型默认为0,double类型默认为0.0,float类型默认为0.0f,
例:
Int :0
Char: ’’(空字符)
Double:0.0
Float:0.0f
String:null
局部变量:
定义在方法中的变量;
定义在方法的参数上的变量;
定义在for循环里边的变量;定义在while()里的变量
局部变量和成员变量的区别和使用原则
(1)成员变量和局部变量可不可以发生重名
原因:可以,成员变量存在堆内存,而局部变量存在于栈内存,两者有所区别,方法的访问会采取默认的就近原则
(2)成员变量有初始值
局部变量在使用之前必须要有初始化,否则编译会报错
理解:如果没有初始化局部变量,但是在后续的代码中,没有编写该局部变量的使用语句,那么编译可以通过,但是代码中如果涉及使用到该局部变量,那么如果没有初始化,编译报错
for(...)循环和while()循环的一个需要注意的地方
在for ()循环中为了循环而定义用的变量,即是指for(int x=0;x<10;x++)中的x而不包括循环体的里面定义变量,在执行完循环体后马上就被内存中释放了,在循环体外不能再用,这部分变量叫局部变量,存储于栈内存中,while()循环中定义的变量也是如此
int[] X = newint[3];这个语句在内存中的分析
java中,定义一个变量,每个变量会有一个变量名,上面的X就是一个刚定义的一个变量名
在栈内存中开辟一个空间存放变量名X
通过new这个关键字,在堆内存当中开辟一个空间,这个空间具有一个内存地址
通过“=”赋给X,从而让X指向这个内存空间。
所以举个简单的例子,就比如x是一个人,定义X的时候即给他一个站的位置,new 是一个动作,可以说是在空地上建造了一座房子,也就创造了一个空间,“=”是另一个人,他把这个房子的地址告诉了X,那么下次X就能找到这个新建的房子的位置,并不是说把这个新建的房子搬到X所站的位置。当然如果又定义了一个Y,那么也可以把这个新建的房子的地址告诉Y,那么Y也可以使用这房子,但是是和X共同使用同一个空间,无任何差别的。
int[] X = newint[3];
int[] Y = X;
X[1]=3;
System.out.println(X[1]);//输出为3
Y[1]=4
System.out.println(X[1]);//输出为4
int a=5;
int b=a;//把a的值复制一份给b
b=6;
System.out.println(b);//输出是6
System.out.println(a);//输出是5
在堆内存中的内容,如果没有任何栈内存的引用,那么则会被认为是垃圾,java会启动垃圾回收机制,不定时回收
int[] X = newint[3];
int[] Y = X;
X[1]=3;
System.out.println(X[1]);//输出为3
Y[1]=4;
System.out.println(X[1]);//输出为4
X=null;//此时空间被垃圾回收机制不定时释放
而栈内存中,用完的变量,立刻就会被释放出内存
PS:以下是在论坛上看到的总结
栈内存:数据使用完毕后,会自动释放;凡是局部变量都在栈内存里
堆内存:new出来的东西都不在栈内存里边,而是在堆内存中;
new出来的实体:数组,对象;
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net