Java中对象的内存图

首先会把执行类的.class文件加载到方法区,把main方法临时存储
main方法存入栈里

单个对象

class Person {
    int age;
    String name;
}
public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 25;
        person.name = "Alice";
    }
}

在堆中,为Person对象分配一块内存空间,用于存储对象的实例变量agename
在栈中,有一个引用变量person,它存储了堆中对象的地址,通过这个引用可以访问堆中的对象。

多个对象

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.age = 25;
        person1.name = "Alice";

        Person person2 = new Person();
        person2.age = 30;
        person2.name = "Bob";
    }
}

堆中有两块不同的内存区域分别用于存储person1person2对象。
栈中有两个引用变量person1person2,分别指向堆中的不同对象。

对象引用传递

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.age = 25;
        person1.name = "Alice";

        Person person2 = person1;
    }
}

堆中只有一个Person对象。
栈中有两个引用变量person1和person2,它们都指向堆中的同一个对象。

对象作为方法参数的内存图

public class Main {
    public static void changePerson(Person p) {
        p.age = 35;
        p.name = "Charlie";
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.age = 25;
        person.name = "Alice";

        changePerson(person);
    }
}

堆中有一个Person对象。
栈中有两个区域,一个是main方法的栈帧,其中有引用变量person;另一个是changePerson方法的栈帧,其中有参数变量p。这两个变量都指向堆中的同一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值