java内存回收期_java内存解析

在学习java过程中,不知道有没有一些小伙伴在运行代码后,觉得这样的结果跟自己想的不一样,但又不知道究竟为何,比如下面一段小程序

public classTest {public static voidmain(String[] args) {int i = 1;

Cat c1= new Cat("Black", 1);

Cat c2= new Cat("Yellow", 2);

changeNum(i);

changeObject(c1);

changeAge(c2);

System.out.println("i=" + i + ", c1=" + c1 + ", c2=" +c2);

}//"改变"数值的方法

public static void changeNum(intnum){

num= 100;

}//"改变"对象的方法

public static voidchangeObject(Cat c){

c= new Cat("Bule", 3);

}//改变猫年龄的方法

public static voidchangeAge(Cat c){

c.setAge(5);

}

}//猫类

classCat {private String color; //毛色

private int age; //年龄

public Cat(String _color, int_age) {super();color =_color;age =_age;

}

@OverridepublicString toString() {return "Cat [color=" + color + ", age=" + age + "]";

}publicString getColor() {returncolor;

}public voidsetColor(String color) {this.color =color;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

}

278e6c11b0eba2c521a8f64d5fdf2451.png

看到运行结果,有些人也许会疑惑i的值和c1为什么并没有改变,只有c2改变了

其实只要我们弄明白java程序在运行过程中的内存情况,就会明白啦。首先,了解一下内存中存放情况

df8a479f39ee87fc56f12d9d527f33f3.png

在执行main方法时,在栈内存中会有三个局部变量:i,c1和c2;在堆内存中会有两个new出来的猫对象,如下:

4cd5999c0bbfbcd499ef52badd8708e9.png

其实当在new出猫的实例时,调用了Cat的构造方法,哪cat1来说,在栈(stack)中分配成员变量color和age;在调用时,分配构造方法的参数变量(形参)并赋值_color=“balck”和_age=1.然后将值分别赋值给color和age。构造方法运行结束,其成员变量全部消失,最终情况即上图所示。

接下来执行changeNum(i);执行过程为:在栈中分配该方法的形参int num;然后将i的值赋予num,即num=1;然后执行方法体,num=100;其实这时候只是num的值改变了,i的值并没有变化,最后方法执行结束,num消失。(下图)

bd6d4eee5ed91284ae7c6dfba0f79353.png

执行方法changeObject(c1)时,同样在栈中分配引用变量(形参)c,并且指向c1对象;执行方法体时,现在堆(heap)中new出一个新对象(“Blue”,3),然后指向了这个新的对象,所以,真正改变的知识c而非c1;方法执行结束,c消失,新的对象没有任何变量指向它,随之也会在合适的时间被垃圾回收期回收。(下图)

a39991943c4be46ea85db286bdea0972.png

最后执行方法changeAge(c2),同样在栈中分配引用变量(形参)c,并且指向c2对象,执行方法体c.setAge(5);将堆内存中的对象age改成了5,最后结束消失,c2仍指向该对象,所以c2改变啦啦啦啦。

995e40b5d158c914f9d06a946e39ec20.png

总结:弄清楚内存进行的情况,能够很好的掌握程序运行过程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值