概述
Java的内存分配和垃圾回收机制
- 1.原代码:
- 2.分析:
今天翻阅PPT,发现了一段非常简单好懂的代码,但是推测运行结果后发现并未想对。主要是对Java的引用类型变量和基本类型变量在内存中的存储方式以及它们的函数传参规则不太清楚,对Java垃圾回收机制不明白造成的。
(如果本文章有错误欢迎指出,谢谢!)
1.原代码:
class Birthday {
private int day;
private int month;
private int year;
public Birthday(int d,int m,int y){
day=d;month=m;year=y;
}
public int getDay(){ return day;}
public int getMonth(){return month;}
public int getYear(){return year;}
public void setDay(int d){day=d;}
public void setMonth(int m) {month=m;}
public void setYear(int y){year=y;}
public void display(){
System.out.println(day+"-"+month+"-"+year);}
}
public class Test{
public static void main(String[] args){
Test test=new Test();
int date=9;
Birthday d1=new Birthday(24,1,1986);
Birthday d2=new Birthday(13,9,1984);
test.change1(date);
test.change2(d1);
test.change3(d2);
System.out.println("date="+date);
d1.display();
d2.display();
}
public void change1(int i){i=1234;}
public void change2(Birthday b){
b=new Birthday(22,2,2022);}
public void change3(Birthday b){b.setDay(22);}
}
运行结果是什么?
现在画图进行分析。
2.分析:
①首先要明白几点基本的内容:
对于基本类型变量(byte,short,int,long,float,double,boolean,char),它们在内存中的存储方式为:基本类型变量在栈中存储的是它们的数据值;
对于引用类型变量(自定义的类或接口,数组,枚举,空类型),它们在内存中的存储方式为:引用类型变量在栈中存储的是它们的数据值在堆中的地址,而它们代表的数据值存储在堆中。
具体表示如下图所示:
②分析原代码:
首先可以明确date为int类型的基本类型变量。它对应的函数为change1, date参数传入后,将其值赋给函数的局部变量i。此时内存为局部变量i分配了它自己的栈空间,函数体将i变为1234,改变的只是i的值,对date的值没有影响,函数体执行完毕后,i将被自动回收。如图所示。
对d1的分析:d1是Birthday自定义类型的变量,它在内存中的存储与date不同。d1对应的函数为change2,此时的函数传参传递的即为地址。即将d1传进去之后,传入的是它的地址而不是变量值。用传入的地址指向new出的新对象,那么地址原来指向的堆空间没有指针将其指向,它就会被Java的内存回收机制回收。d1指向的即为新对象。如图所示:
对d2的分析:d2与d1相同,都是引用类型变量,那么传参时传递的自然也是地址。d2对应的函数为change3,函数体执行后,改变了d2指向的Birthday对象的day值。分析方式与d1类似。具体如图所示:
所以最后的执行结果是:
date=9
22-2-2022
22-9-1984
最后
以上就是野性爆米花为你收集整理的Java的内存分配和垃圾回收机制1.原代码:2.分析:的全部内容,希望文章能够帮你解决Java的内存分配和垃圾回收机制1.原代码:2.分析:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复