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

最近在看一本李刚老师的书《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
	}
}


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值