• java基础--06对象内存图


    1个对象的内存图

    这里写图片描述

    图中包含栈内存、堆内存和方法区

    方法区中包含class文件内容,分成两块,一块是PhoneDemo.class另一块是Phone.class

    其中Phone.class中包含成员变量和成员方法
    PhoneDemo.class中包含一个main方法

    1.加载main方法到栈内存中

    2.Phone p = new Phone();

    在栈内存中创建一个Phone类型的引用对象 p ;
    在堆内存中创建一个Phone对象,同时在堆内存中创建Phone对象的成员变量:brand(默认null),price(默认0),color(默认null)
    让引用对象p指向Phone对象(引用对象p持有了堆内存中Phone对象的一个地址值)

    注:方法区中,Phone.class的方法在堆内存中Phone对象中也持有这些方法的引用,以便于在执行Phone对象的方法的时候快速定位并执行

    3.System.out.println(p.brand+” “+p.price+” “+p.color);
    打印对象的初始化值:null 0 null

    4.p.brand=”三星”
    p.price=3999
    p.color=”白色”

    给堆内存中Phone对象进行赋值,赋值之后该对象的成员变量变成了:brand:”三星”,price:3999,color:”白色”

    5.System.out.println(p.brand+” “+p.price+” “+p.color);

    打印:”三星” 3999 “白色”

    6.p.call(“乔布斯”)
    首先在方法区中找到call方法,然后加载到栈内存中,执行call()方法,执行完毕之后,从栈内存空间中消失
    p.sendMessage()、p.playGame() 方法同上,也是先加载到栈内存,执行完毕之后从栈内存中消失

    2个对象的内存图

    这里写图片描述

    这里牵涉到方法的共用

    在堆内存中new出的两个对象在调用方法的时候,因为方法的内容是不变的,所以两个对象调用的方法也是相同的,由堆内存指向方法区的方法引用来间接调用Phone类的方法

    3个对象的内存图

    这里写图片描述

    其中有两个引用指向同一个对象

    就是p3所引用的对象和p1引用的对象在堆内存中是同一个对象
    通过p3改变成员变量的值,也就等同于使用p1改变了这个对象成员变量的值

  • 相关阅读:
    MySQL Limit优化(转)
    MySQL数据库性能优化思路与解决方法(一转)
    Mysql占用CPU过高如何优化?(转)
    数据库方面两个简单实用的优化方法(转)
    硬盘扩容9999T
    python内涵段子爬取练习
    jmeter环境配置
    PyCharm3.0默认快捷键
    python3 操作页面上各种元素的方法
    python3 selenium webdriver 元素定位xpath定位骚操作
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932835.html
Copyright © 2020-2023  润新知