最近在看一本李老师的书《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
}
}
以上就是本次介绍的内容,如果有错的地方欢迎补充讨论