欢迎使用CSDN-markdown编辑器

java 复习Day_01 内存分析

java内存分析,在Java中的传递都是值传递。

我们在这之前要明白一个概念就是内存分为三部分,分别为栈内存,堆内存和方法区
1.栈内存  是快速连续的存储空间,必须存放一直大小,知道生命周期,一般存放基本数据类型的数据
2.堆内存  是链式结构,灵活的控制内存的分配
3.方法区 存放类的字节码文件,静态变量 ,字符串变量 

首先,分析一下基本数据类型的值传递方式。

    public static void main(String[] args){
        int a=5;
        int b=10;
        change(a,b);
    }
    public static void change(int a,int b){
        int c=a;
        a=b;
        b=c;
    }
先运行main里面的函数,将a,b赋值,然后进入change函数,在函数里面运行了一下数字转换, change方法会在堆内存里面创建一个空间存放方法里面使用到的变量,mian函数里面的变量是放在占内存里面的,所以当change方法里面的变量发生改变的时候,并不会改变栈内存里面的变量的值,所以输出的还是10和5。
下面是方法运行的图:

内存分析图
上面是基本数据类型的值传递 现在我们分析一下引用类型的值传递

class Date {
    int year;
    int month;
    int day;
    public void show() {
        System.out.println("Date.show(今天是" + year + "-" + month + "-" + day + ")");
    }
}
public static void main(String[] args){
    Date d1=new Date();
    change01(d1)
    d1.show();
}
public static void change01(Date date){
    date.year=6000;
}

在这里定义了一个date类,在main方法里面new了一个新的实例d1,这个d1是存放在栈内存里面的,然而在类会在堆内存里面创建一个空间,存放类的字段和方法,d1在栈里面存放的是堆内存新建那个空间的地址,所以当year改变的是改地址里面的year 所以里面的值会变化。输出的是6000 下面是内存分析图
内存分析图

下面我们有定义了一个方法change02()

public static void change02(Date date,int num){
    date.year=2016;
    num=100000;
}

我们如果调用这个方法 看看这个num输出的是多少,我们来看看 内存分析图,再来判断。

内存分析图

通过图片我们可以看出,方法里面改变的num的值 是堆内存里面的num 栈内存里面的num值并没有改变,所以输出的还是110 如果在末尾加上return 则会把堆内存里面的num返回到栈内存里面 那个时候输出的num就是10000

我们在定义一个方法change03()

public static void change03(Date date) {
        date = new Date();
        date.year = 3000;
    }

在这个方法里面, 传入一个参数,然后在方法里面对这个参数重新生成了一下实例, 这个时候date的地址就会发生改变, 下面改变的year的值是新创建这个date里面的。所以输出的话,d1的year还是0,没有定义。
下面看我的内存分析图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值