一、 数组的定义
1. 类型[] 数组名
2. 类型 数组名[]
数组是一种引用类型的变量,使用他进行定义时,仅仅定义一个引用变量【指针】,这个引用类型的变量并未指向任何一个内存,所以定义数组的时候,不能指定数组长度,定义的数组不能被使用,对数组进行初始化后才能使用。
二、数组的初始化
静态初始化:由程序员指定数组的内容,由系统自动分配数组长度
动态初始化:程序员指定数组长度,系统为元素分配初始值
静态初始化语法: arr=new arraytype[]{元素1,元素2,元素3};
实际开发过程中,数组的定义和初始化一般情况下同时完成如: atttype[] arr={"",""};
三、使用数组
数组初始化完成后,就可以使用数组元素了,包括访问数组,为数组赋值,获取数组长度
访问数组元素:数组变量后紧跟一个[],里面为数组的索引
访问数组元素后就可以为数组元素赋值。eg: arr[1]=""
数组越界异常:java.lang.ArryIndexOutOfBoundsException:N。N为试图访问的索引
四、深入数组:
数组是一种引用数据类型,数组的引用变量只是一种引用,数组元素和数组变量是分开存放的。
如果希望在程序中访问数组对象本身,只能通过数组的对象访问他
1. 内存中的数组
实际的数组对象存储在堆内存中,如果引用变量是一个局部变量,则他被存储在栈内存中。数组的引用变量是访问数组的堆内存中元素的根本方式。
定义并且初始化数组后,为数组分配了两个空间,一个用于存放数组的引用空间,另一个用来存放数组本身
2. 堆内存和栈内存的区别:
栈内存:执行一个方法时,每个方法都会建立自己的内存栈,方法中定义的变量会被存储在栈内存中,随着方法的结束,栈内存将会被销毁。在方法中定义的局部变量均存放在栈内存。
堆内存:是指创建对象时候,对象会被存储在运行时数据区,运行时数据区,是堆内存,堆内存的对象不会随着方法的结束而销毁,只有没有引用变量指向该堆内存时,系统的垃圾回收机制会回收他
public static void main(String[] args) { //定义一个静态数组 int[] a={1,2,3,4}; //定义一个非静态的数组定义 int[] b=new int[4]; System.out.println(arr1.length); for (int arrdata:arr1){ System.out.println(arrdata); } b=a; }
当定义并初始化数组后,如执行 int[] a={1,2,3,4},int[] b=new int[4]后,系统会分类四个内存空间,存放a,b的引用变量,存放a,b的实际数组。
执行b=a后,其实就是将b的引用对象指向a的地址。
3. 引用类型数组运行过程:
引用类数组的数组元素是引用,每个数组元素里面存储的仍是引用,指向另一块内存,该内存存储了有效数据
public class DemoTest { static class Person{ public int age; public int height; public void info(){ System.out.println("我的年龄是"+age+"我的身高是"+height); } } public static void main(String[] args) { //定义一个Person Person[] student; //执行初始化数组 student=new Person[2]; //创建一个Person 实例,赋值给zhang Person zhang=new Person(); zhang.height=12; zhang.age=10; Person li=new Person(); li.age=90; li.height=190; student[0]=zhang; student[1]=li; student[1].info(); li.info(); } }
执行 Person[] student; 给栈内存中存储一个引用变量student。
执行初始化后student=new Person[2]【动态初始化】,会在堆内存中分配两个null对象。student数组两个数组元素都是引用,引用并未指向有效的内存,