1.Java中内存划分
- 栈:存放局部变量和栈帧.效率最高.
- 堆:存放New出来东西.(数组和对象及成员变量)效率比栈低一点.
- 方法区:存放.class字节码文件,静态变量及常量池.效率最低.
2.一个对象内存分析
eg:public static void main(String[] args) {
//创建对象
Student stu1=new Student();
//用对象调用属性并赋值
stu1.stuName="刘梦龙";
stu1.stuAge=47;
//用对象调用属性并输出
System.out.println("姓名:"+stu1.stuName+",年龄为:"+stu1.stuAge);
}
3.多个对象内存分析
eg:public static void main(String[] args) {
//创建对象
Student stu1=new Student();
//用对象调用属性并赋值
stu1.stuName="刘梦龙";
stu1.stuAge=47;
//用对象调用属性并输出
System.out.println("姓名:"+stu1.stuName+",年龄为:"+stu1.stuAge);
Student stu2=new Student();
stu2.stuName="迪丽热巴";
stu2.stuAge=18;
System.out.println("姓名:"+stu2.stuName+",年龄为:"+stu2.stuAge);
}
4.值传递
- 方法的形参是基本数据类型叫值传递.值传递将变量的值复制一份传递方法的形参,
- 在方法中对形参作了更改,形参的值确实改变,方法执行完后,原来的变量的值是不变的.
eg:public static void main(String[] args) {
//声明两个变量
int a=8;
int b=10;
System.out.println("互换前:a="+a+",b="+b);
//创建对象
NumberManager nm=new NumberManager();
//用对象调用方法实现两个数互换
nm.changeNum(a, b);
System.out.println("互换后:a="+a+",b="+b);
}
5.引用传递
- 方法的形参是引用数据类型叫引用传递.引用传递传的变量的内存地址,所以在方法中对这个内存地址中值作了更改,在方法中值改变.方法执行完后,原变量的内存中值也改变了.
public static void main(String[] args) {
//创建对象
Rabbit b1=new Rabbit();
//用对象调用属性并赋值
b1.nickName="小红";
b1.sex='雌';
System.out.println("改变前:兔子昵称:"+b1.nickName+",兔子的性别:"+b1.sex);
//创建对象
NumberManager nm=new NumberManager();
//用对象调用方法改变对象的属性值
nm.changeRabbit(b1);
System.out.println("改变后:兔子昵称:"+b1.nickName+",兔子的性别:"+b1.sex);
}
6.二维数组内存分析
eg:public static void main(String[] args) {
//声明一个一维数组
int[] nums1= {11,33,22};
int[] nums2=new int[2];
nums2[0]=18;
nums2[1]=28;
//准备二维数组
int[][] nums3= {{5,2},{7,9}};
int[][] nums4=new int[3][2];
nums4[0][0]=11;
nums4[0][1]=12;
nums4[1][0]=21;
nums4[1][1]=22;
nums4[2][0]=31;
nums4[2][1]=32;
}
7.(扩展)对象数组
- 本质还是一维数组,只是数组的每个空间存的是对象地址.
- 特点:对象数组整体遵循数组的使用原则;数组每个空间遵循对象的使用原则(先创建对象,才能用对象调用属性)
eg:public static void main(String[] args) {
//创建一个一维数组
int[] nums1=new int[3];
//给数组的每个空间赋值
nums1[0]=11;
nums1[1]=12;
nums1[2]=13;
//创建一个二维数组
int[][] nums2=new int[2][];
//给二维数组的每个空间赋值(即给一维数组分配空间)
nums2[0]=new int[2];
nums2[1]=new int[3];
//给二维数组的每个空间一维数组的每个空间赋值
nums2[0][0]=21;
nums2[0][1]=22;
nums2[1][0]=31;
nums2[1][1]=32;
nums2[1][2]=33;
//创建对象数据:本质还是一维数组,只是数组的每个空间是一个对象
People[] peoples3=new People[2];
//给对象数组的每个空间赋值,注意对象数组每个空间是对象,对象要先创建,才能用属性存值
//注意:对象数组名[索引]相当于对象名
peoples3[0]=new People();
//用对象调用属性存值
peoples3[0].pname="刘梦龙";
peoples3[0].page=18;
peoples3[0].psex='女';
peoples3[0].saveMoney=100;
peoples3[1]=new People();
//用对象调用属性存值
peoples3[1].pname="彭于郾";
peoples3[1].page=38;
peoples3[1].psex='男';
peoples3[1].saveMoney=1000000;
//遍历一维数组
for (int n1 : nums1) {
System.out.println(n1);
}
System.out.println("------------------------------");
//遍历二维数组
for (int[] n2 : nums2) {
//System.out.println(n2);
System.out.println(Arrays.toString(n2));
}
System.out.println("**********************************");
//遍历对象数组
for (People p3 : peoples3) {
//遍历的每个元素是一个对象,对象可以调用属性输出
System.out.println(p3.pname+","+p3.page);
}
}
1.java中内存划分
2.一个对象内存分析
3.多个对象内存分析
4.值传递
5.引用传递
6.二维数组内存分析
7.(扩展)对象数组