一、 数组的定义
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; }


javachar数组先定义后赋值 数组先定义后使用_数组元素

当定义并初始化数组后,如执行  int[] a={1,2,3,4},int[] b=new int[4]后,系统会分类四个内存空间,存放a,b的引用变量,存放a,b的实际数组。

javachar数组先定义后赋值 数组先定义后使用_javachar数组先定义后赋值_02

执行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();

    }
}


javachar数组先定义后赋值 数组先定义后使用_java_03

执行 Person[] student; 给栈内存中存储一个引用变量student。

 

javachar数组先定义后赋值 数组先定义后使用_数组_04

 执行初始化后student=new Person[2]【动态初始化】,会在堆内存中分配两个null对象。student数组两个数组元素都是引用,引用并未指向有效的内存,

javachar数组先定义后赋值 数组先定义后使用_数组元素_05

javachar数组先定义后赋值 数组先定义后使用_java_06