对象在内存中存在的形式

程序运行起来会在内存划分为如图几个区域:

堆区:对象

栈区:基本数据类型(String类型也会存放在栈区)

全局区:存放全局数据

常量区:存放常量

代码区:存放代码

看下面一段代码

public class PersonOBJ{
    public static void main(String[] args){
        class Person{
            int age;
            String name;
        }
        Person a = new Person();
        a.age = 10;
        a.name = "小明";
        Person b = a;     System.out.println(a.name);
        System.out.println(b.name);
    }
}

内存图:

存储地址以十六进制表示,存储地址类似房间门牌号,而变量(对象)相当于为门牌号命名,地址分配的十六进制数不是如图所示,而是取决于操作系统的分配。

Person a存放了一个对象(new Person())的地址(比如说[0x123]),Person a其自身也有个地址(比如说[0x111]),

但为了方便就简写成Person a存放了一个(new Person())对象的地址(Person a [0x123])。

Person a =new  Person();会在内存中开辟一个新的堆空间,堆空间存放一个存储地址为0x123的具有Person类属性的Person a对象

在new Person();创建对象后,赋给栈区Person a变量,Person a将引用对象new Person();所在堆区的地址[0x123]

访问并赋值对象属性(a.age=10),会查找对象所在堆区的地址[0x123],并赋值相应属性值;a.name="小明"以此类推。

Person b =a;

Person b仍然在栈区,把a变量(对象)赋给Person b实际上赋的值是堆区类的地址[0x123],

也就是说两个变量指向了堆空间的同一个地址,这也就是为什么看到两个小明的原因。

时间: 2025-01-02 16:31:00

对象在内存中存在的形式的相关文章

PHP对象在内存中的分配

在网上看到一篇关于php对象在内存中分配的博文,特地记录下来,再稍微修饰下. 对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢? 内存从逻 辑上 说大体上是分为4 段,栈空间段.堆空间段.代码段.初始化静态段,程序里面不同的声明 放在不同的内存段里面. 数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量: 代码段(code segment / te

获取内存中整数二进制形式

采用移位和相与方式求整数在内存中的二进制形式. #include<stdio.h> typedef int DataType; int num_covert_binary(DataType num); void main() { DataType num; num = -1; num_covert_binary(num); num = 12; num_covert_binary(num); getchar();//让console 等待一下 } int num_covert_binary(Da

Java对象在内存中的存储

Java对象在内存中的存储分3块区域 1.对象头(Header) 2.实例数据(Instance Data) 3.对齐填充(Padding) 一.对象头 哈希码.GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳 类型指针 二.实例数据 各种类型的字段(父类继承下来的.子类自身定义的) 相同宽度的字段会被分配到一起 三.对齐填充 没有特别含义,仅仅起着占位符的作用(8字节的整数倍)

JVM内存模型及对象在内存中初始化的过程

JVM内存模型 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选 取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需 要依赖这个计数器来完成. Java虚拟机的多线程是是通过线程轮流切

PHP面向对象(PHP对象在内存中的分配)

对 像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻 辑上 说大体上是分为4 段,栈空间段.堆空间段.代码段.初始化静态段,程序里面不同的声明 放在不同的内存段里面,数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量:代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法:

整型数据在内存中的存放形式

整型数据在内存中是以其二进制的补码的形式存放的! 1.原码 就是以最高位作为符号位,0代表该数值为正,1代表为负! 比如:67和-67 2.反码 正数的原码.反码.补码相同! 负数的反码是在其符号位不变的基础之上,其余的数值位按位取反,就是0变成1,1变成0 3.补码 正数的原码.反码.补码相同! 负数的补码是其反码加1! 也就是说,在内存中,67其实存放的就是: 00000000 00000000 00000000 01000011 而-67其实存放的就是: 11111111 11111111

Python中类和对象在内存中是如何保存?

类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类. 当通过 obj1 执行 [方法一] 时,过程如下: 根据当前对象中的 类对象指针 找到类中的方法 将对象 obj1 当作参数传给 方法的第一个参数 self 

【转】PHP对象在内存中的分配

对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空间段.代码段.初始化静态段,程序里面不同的声明 放在不同的内存段里面. 数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量 代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法 栈

记一次对java对象在内存中的分析

java 对象 占内存大小 计算方式 及 常用类型的占用 HotSpot的对齐方式为8字节对齐 ----计算公式:(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8 Hotspot 机 中 普通对象32位 对象头 占 8个字节 引用类型 占 4字节64位 对象头 占 16个字节 引用类型 占 8字节 64位中 空对象数组 对象头 占 24 增加一个长度 增加 一个引用类型的长度 64位中是 8空的基本数据类型数组 对象头 占 24 增加一个长度 增加一