java学习笔记1--数组初始化时的内存分配

来源:互联网 发布:js格式视频 编辑:程序博客网 时间:2024/04/30 16:25

最近在看一本李刚老师的书《java程序员的基本修养》,看了之后突然觉得自己虽然用了两年的java却实际上根本不了解java

下面就来分享一下学习经历吧!

有如下几个问题:

1.在java中,声明并创建数组的过程中,内存是如何分配的?

2.java数组的初始化一共有哪几种方式?

有如下程序:

class JavaTest{    //数组的内存分配    public static void main(String[] args){   //数组初始化有两种方式,一种是静态初始化,一种是动态初始化   //静态初始化第一个数组   String[] books = new String[]{      "java程序设计",  "C程序设计",  "C++程序设计"   };   //动态初始化第二个数组   String[] names = new String[5];   //初始化数组时,数组变量books和names保存在栈内存中,他们的值只是指向数组对象的地址,   //而数组对象保存在堆内存中   System.out.println("第一个数组的长度:"+books.length);//3   System.out.println("第二个数组的长度:"+names.length);//5   //此时在内存的分配如图1.1所示      //注意:   //1、不要同时使用静态初始化和动态初始化   //2、数组元素的内存空间分配结束之后程序只能改变数组的值,而无法改变数组的长度,但有如下情况      //将数组books赋给names   names = books;   System.out.println("改变后的第二个数组的长度:"+names.length);//3   //注意:这里确实改变了长度,但是原本初始化的第二个数组对象并没有改变,改变的是names这个变量,   //如图1.2所示,names变量重新引用了第一个数组对象,这样造成的数组可以改变的假象   }     }



3.基本类型数组和引用类型数组之间,在初始化时的内存分配机制有什么区别?

上面讲的是基本类型数组的初始化,接下来讲讲引用类型数组的初始化

有如下程序

class Person{   public int age;   public String name;   public void info(){      System.out.println("我的名字:"+name);   }}class ReferenceArray{    public static void main(String[] args){//动态初始化一个引用类型数组  Person[] students;  students = new Person[2];  //此时内存分配如图1.3所示  System.out.println("students所引用的数组的长度是:"+students.length);  //创建一个Person实例  Person zhong = new Person();  zhong.age=20;  zhong.name="joffy";    //创建另一个Person实例  Person lee = new Person();  lee.age=21;  lee.name="david";  //此时内存分配如图1.4所示  //将两个person实例赋给students数组  students[0]=zhong;  students[1]=lee;  //students数组保存的仍然是一个引用,指向另一块内存,该内存保存zhong和lee对象  //调用info方法  lee.info();//david  students[0].info();//joffy}}


以上就是本次介绍的内容,如果有错的地方欢迎补充讨论



0 0
原创粉丝点击