zoukankan      html  css  js  c++  java
  • 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改变了这个对象成员变量的值

  • 相关阅读:
    Soldier and Number Game素数筛
    HDU1501Zipper字符串的dfs
    HDU1285 确定比赛名次 拓扑排序模板题
    HDU1595 find the longest of the shortest dijkstra+记录路径
    HDU1556 Color the ball 前缀和/线段树/树状数组
    Function Run Fun递归+细节处理
    数学公式
    日常 java+雅思+训练题1
    HDU1423Greatest Common Increasing Subsequence
    HDU1595find the longest of the shortestdijkstra+记录路径
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932835.html
Copyright © 2011-2022 走看看