class ArrayDemo
{
public static void main(String[] args)
{
int [] arr=new int[5];
System.out.println("数组长度为: "+arr.length);
System.out.println(arr); //此时会出现一个特殊的[I@de6ced
printArray(arr);
}
public static void printArray(int[] arr) //定义一个方法,打印数组的每一个元素
{
for(int x=0; x<arr.length ; x++)
{
if(x<arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
}
}
/*
总结:
1, “功能方法” 的声明,根据访问权限的不同,调用时作用范围随之改变,但必须声明在某个类中。
可以放在main方法体的上方,也可以放在其下方,这是无关紧要的,因为程序执行时总是从main方法作为程序的入口。
2, 方法调用时应将调用方法写在main方法体内。
3, 定义一个数组有两种方法:
① 用int []arr={...}; 数组数据类型 []数组名称={数据元素1,数据元素2,数据元素3...}; 相当于②的进一步。
② int []arr=new int[3]; 数组数据类型 []数组名称=new关键字 数组数据类型[数组维数];
Ps:
注意 此程序中的arr为数组类型,也就是引用数据类型。而不是int型。此程序中的int是指数组中的元素为int类型。
数据类型有两种:
基本数据类型---int、float、char、boolean
引用数据类型---array、class、interface
数组维数一定不能忘!数组若未初始化赋值,则数组中每个元素默认值为0,默认数组下标从0开始。
4, 若直接打印输出数组名称,则会输出结果: [I@de6ced [ 表示为数组, I表示数组中的元素为整型,@后是数组地址,
(Ps: 这里理解不清楚,在执行这个没意义的代码 System.out.println(arr); 时,无论arr数组中存放任何元素
打印输出的都是 [I@de6ced ,程序在int []arr={...};或者 int []arr=new int[3]; 在堆内存中开辟一个空间用于存放数组中各个元素的值,而arr是定义在
栈内存中的,是通过引用堆内存中的下标的值。 ..!菜鸟有个疑问:此时在堆内存中开辟的数组的地址是固定的么?)
*/
=======================================================================================
class ArrayDemo1
{
public static void main(String []args)
{
int [] x=new int[3];
x[0]=41;
// x=null;
}
public static void show()
{
int m=3;
System.out.println(m);
}
}
/*
总结:
1, 程序在调用JVM虚拟机执行程序时会在系统的栈内存中开辟一个空间用于存放数组类型的x 。
2, 凡是局部变量(什么是局部变量---定义在方法里的变量,定义在方法中的参数上的变量,定义在for循环中的变量),都定义在栈 内存里,
堆内存中的每一个实体都有一个存放位置。
3, 执行赋值动作,不是赋具体的数值,而是将数组在内存中的首地址赋给栈内存中的x,成为x指向了这个数组,或称为引用了这个数组。数组没有真正存放到x中去,x只存放数组的地址。堆内存中的实体是用来封装数据的,而实体中的每个数据都有默认初始化值。默认初始化值根据数组元素类型不同而不同。
4, x[0]=41; 该语句为 数组类型的x引用数组下标为0的元素的值为41 。
5, x=null; 表明数组类型的x的值为null,不再指向数组下标为0在堆内存中的地址。此时栈内存中的x不再引用堆内存中数组的实体数据,则此时JVM将视堆内存中的该
实体为垃圾,JVM会不定时启动java特有的垃圾回收机制,将堆内存中的垃圾清除掉。
6, 栈内存的特点是:数据使用完毕会自动清除,
堆内存的特点是:依靠java特有个垃圾回收机制,不定时清除内存中的垃圾。
*/
=============
图1:
===========================================================
图2