创建两个对象的内存图解——方法的共用

该文详细阐述了Java程序运行时内存的分配过程,以Phone1类为例,展示了如何创建对象,给成员变量赋值,以及调用成员方法。文章提到了类加载到方法区,对象在堆中分配空间,以及栈中存储方法调用的过程。此外,还涉及到对象默认值和方法执行后的垃圾回收。
摘要由CSDN通过智能技术生成
class Phone1{
    //定义成员变量
    String brand;
    int price;
    String color;

    //定义成员方法
    public void call(String s){
        System.out.println("打电话给"+s);
    }
    public void sendMessage(){
        System.out.println("发信息");
    }
    public void listenMusic(){
        System.out.println("听音乐");
    }
}

public class PhoneTest2 {
    public static void main(String[] args) {
        //定义第一个手机对象
        Phone1 p1 = new Phone1();
        //给手机对象p1成员变量赋值
        p1.brand = "小米";
        p1.price = 1999;
        p1.color = "白色";
        System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
        p1.call("雷军");
        p1.sendMessage();
        p1.listenMusic();

        //定义第二个手机对象
        Phone1 p2 = new Phone1();
        p2.brand = "苹果";
        p2.price = 4999;
        p2.color = "绿色";
        System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
        p2.call("乔布斯");
        p2.sendMessage();
        p2.listenMusic();
    }
}

内存中的解释:

Step1:程序先将class文件(Phone1.class,PhoneTest2.class)加载到方法区

Step2:把每个class文件的方法加载到class文件区

             Phone1.class的方法:call(String s),sendMessage(),listenMusic() (假设这一部分地址值为0x001)

             Phone2.class的方法:main()(假设这个方法区的地址值为0x002)

Step3:程序一开始运行,先将main方法加载到栈中来执行

Step4:读到Phone1 p1在栈中开辟空间,读到new Phone1在堆里面开辟空间(一个创建对象里面包括brand,price,color,方法区的标记0x001)

Step5:一开始创建出来的对象,系统给默认值:brand=null,price=0,color=null(假设在堆中创建对象的地址值为0x0001),初始化值全部都有结束以后,将地址值0x0001赋给变量p1(变量p1就能通过地址值找到对象在堆内存中的区域)

Step6:p1.brand = "小米";p1通过地址值(0x0001)找到堆内存中的对象区域,把"小米"赋给brand

             p1.price = 1999;p1通过地址值(0x0001)找到堆内存中的对象区域,把1999赋给price

             p1.color = "白色";p1通过地址值(0x0001)找到堆内存中的对象区域,把"白色"赋给color

......

Step7:p1.call("雷军");p1通过地址值(0x0001)找到堆内存中的对象区域中的方法区的标记0x001,找到call(String s)方法,然后将call方法加载到栈中来执行,结束以后,等待回收垃圾

Step8:p1.sendMessage();p1通过地址值(0x0001)找到堆内存中的对象区域中的方法区的标记0x001,找到sendMessage()方法,然后将sendMessage方法加载到栈中来执行,结束以后,等待回收垃圾

Step9:p1.listenMusic();p1通过地址值(0x0001)找到堆内存中的对象区域中的方法区的标记0x001,找到listenMusic()方法,然后将listenMusic方法加载到栈中来执行,结束以后,等待回收垃圾

Step10:读到Phone1 p2在栈中重新开辟空间,读到new Phone1在堆里面重新开辟空间(一个创建对象里面包括brand,price,color,方法区的标记0x001)

Step11:一开始创建出来的对象,系统给默认值:brand=null,price=0,color=null(假设在堆中创建对象的地址值为0x0002),初始化值全部都有结束以后,将地址值0x0002赋给变量p2(变量p2就能通过地址值找到对象在堆内存中的区域)

Step12:p2.brand = "苹果";p2通过地址值(0x0002)找到堆内存中的对象区域,把"苹果"赋给brand

               p2.price = 4999;p2通过地址值(0x0002)找到堆内存中的对象区域,把4999赋给price

               p2.color = "绿色";p2通过地址值(0x0002)找到堆内存中的对象区域,把"绿色"赋给color

......

Step13:p2.call("乔布斯");p2通过地址值(0x0002)找到堆内存中的对象区域中的方法区的标记0x001,找到call(String s)方法,然后将call方法加载到栈中来执行,结束以后,等待回收垃圾

Step14:p2.sendMessage();p2通过地址值(0x0002)找到堆内存中的对象区域中的方法区的标记0x001,找到sendMessage()方法,然后将sendMessage方法加载到栈中来执行,结束以后,等待回收垃圾

Step15:p2.listenMusic();p2通过地址值(0x0002)找到堆内存中的对象区域中的方法区的标记0x001,找到listenMusic()方法,然后将listenMusic方法加载到栈中来执行,结束以后,等待回收垃圾

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

+7_big data

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值