Java的内存分配和垃圾回收机制

Java的内存分配和垃圾回收机制

今天翻阅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将被自动回收。如图所示。

date值的分析情况
对d1的分析:d1是Birthday自定义类型的变量,它在内存中的存储与date不同。d1对应的函数为change2,此时的函数传参传递的即为地址。即将d1传进去之后,传入的是它的地址而不是变量值。用传入的地址指向new出的新对象,那么地址原来指向的堆空间没有指针将其指向,它就会被Java的内存回收机制回收。d1指向的即为新对象。如图所示:

对d1的分析
对d2的分析:d2与d1相同,都是引用类型变量,那么传参时传递的自然也是地址。d2对应的函数为change3,函数体执行后,改变了d2指向的Birthday对象的day值。分析方式与d1类似。具体如图所示:

对d2的分析

所以最后的执行结果是:
date=9
22-2-2022
22-9-1984

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值