`

0_对象和内存

 
阅读更多

 

前言: 了解对象,数据在内存的细节, 有助于程序员设计出更加合理地结构。

 

指针和对象的关系:指针指向对象在内存中首地址的位置

 


 

 

指针之间赋值:

1 指针间的赋值与基本类型赋值一样,它并不会引起对对象的操作。

2 指针之间赋值是将 指针的内容赋值到另一个指针中,后者的内容将会丢失。

 

 


 

 

对象的内存表示:

 


 

字符串的内存表示:

 

串的内存表示
      串是最常用的类,也是Java特殊对待的类型之一(另一个是数组)。
      串是定常的。无论一个串存储在哪里,它所包含内容是不可改变的。
      字面常量表达的串(eg: "abc"),存储在特殊的位置:串池中。串池的特点是:不允许重复,也不会去回收垃圾。

 

串池:  (注意 里面仅存放 字面常量, 并且不会被垃圾回收)


 

 

看下面案例:


 

	public static void main(String[] args) {

		String a = "abc";
		String b = "ab" + "c";
		//System.out.println(a == b); true  b做计算后又会引用串池中的 abc, 因此  两者表达的内存地址是一致的
		
		String c = new String("abc");
		System.out.println(a == c); // false    c的操作会在堆内存中重新创建一个空间放abc, 此时不再应用到串池中的内容,因此两者的内的物理地址不一样 结果为false
	}

 

 


 数组的内存表示:

  数组是Java特殊对待的类型。一个数组中的所有元素占据一片连续的内存空间。

  数组的长度在创建时固定,将来无法修改。
  数组在随机访问的时候速度最快,但在插入、删除元素时却十分吃力。

 数组的每个元素在内存中占用的空间大小一样。

  数组不能再原有大小下继续开辟空间,

 

  因为鉴于数据元素占用内存地址连续这个前提下,在数组最后数据位置的下一个地址

  无法预料这个地址是否被别的对象占用,因此数组不支持动态添加长度,只能重新创建更长一个新数组并赋值。

  同时,在数组中间位置删除元素也给数组带来很繁琐的操作,后续元素必须依次回挪到上一个 内存地址上才能保证数组元素

  地址保持联系性这个特性。

 



 

 

 

 

关于多态是如何找到真实对象的:

 

 

对于每一个对象,内存中总是有一个字段,此字段指向了该对象的类型信息对象,真实类型是=右侧的类型

同时,每个对象都有自己的父类型信息指针,指向其父亲,

 

对于如下代码, a的对象类型信息是C,执行a.f()时,a的祖先们通过自身的父类型信息指针将祖先各自连接成一个链条,并自动匹配具体调用哪个类的方法

A a = new C();

a.f();

 

 

 


 

 

 


 

  • 大小: 45.4 KB
  • 大小: 71 KB
  • 大小: 67 KB
  • 大小: 19.3 KB
  • 大小: 33.6 KB
  • 大小: 38.5 KB
分享到:
评论

相关推荐

    memcache的tcp_udp_内存流程图.pdf

    计算所需的内存单元大小item_make_header(key_len+1(加1表示字符串末尾的"0"), client_flag, data_len, buf, &extral_len)) | 根据所需大小查找内存单元 slabs_clsid(need_size) --> 检查是否存在内存分组 ...

    Java的内存管理机制分析

    Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它

    精易官方免费模块v3.60版

    4.删除“内存_优化” 在程序最小化和后台时系统会自动调用该函数来节省内存 个人使用,容易出现各种各样的问题,详情:http://bbs.125.la/thread-13690978-1-1.html 感谢 红河 的提醒 ,感谢 落雪 的详细分析文章 ...

    OpenSSL-1_0_0d_Win32

    首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时...

    boost_1_60_0头文件和库

    字符串及文本处理、容器、迭代子(Iterator)、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、内存相关、语法分析、杂项。...

    VC 创建内存映像文件对象并使用.rar

    VC 6.0 创建内存映像文件对象并使用,实现了写入内存映射文件和从内存映射文件中读取数据,比如将数据从内存映射文件读出,实现方法如下:  void CFileMapTransTxtDlg::OnRead()  {   //创建内存映像对象   ...

    内存管理内存管理内存管理

    现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存...

    jprofiler_linux_11_0.tar.gz

    JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。 2.堆遍历 Heap walker 在JProfiler...

    Java 对象搜索器 - java内存对象搜索辅助工具

    Java 对象搜索器 | java内存对象搜索辅助工具 肖像画家 肖像画家 肖像画家 0x01 工具简介 ############################################################# Java Object Searcher v0.01 author: c0ny1 github: ...

    操作系统(内存管理)

    现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。...

    传智播客扫地僧视频讲义源码

    03_用面向过程和面向对象方法求解圆形面积_类和对象的关系思考_传智扫地僧 04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行...

    java性能分析神器 jprofiler_windows-x64_10_0_4

    JProfiler直觉式的GUI让你可以找到性能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器...它允许两个内存剖面评估内存使用情况和动态分配泄漏和CPU剖析,以评估线程冲突。

    ManageEngine_ADManager_Plus_64_7.1

    利用直观的网站界面,这款软件可以处理各种复杂任务,例如批量管理用户帐户和其他 AD 对象,将基于角色的访问权委派给帮助台技术人员,以及生成详尽的 AD 报表,其中一些是满足合规性审核必需的报表。这个 Active ...

    安卓逆向学习笔记之ART中的C++对象内存布局及获取art-method和dex-file对象.docx

    安卓逆向学习笔记之ART中的C++对象内存布局及获取art-method和dex-file对象.docx

    Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结

    在我们试图新建一个对象时,而垃圾收集器又找不到任何可用内存时被抛出,这种情况下我们是可以捕获该 异常的; 另一种情况是,CLR需要内存时,而却系统却不能提供,也会抛出该异常. 但此时,我们的应用程序是不能捕获该...

    MemoryAnalyzer(JDK11)-1.12.0.20210602-win32.win32.x86_64_.zip

    Memory Analyzer Tool(MAT)工具是 eclipse 的一个插件(MAT 也可以单独使用),它分析大内存的 dump 文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用 OQL 对象查询,...

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    jprofiler_windows_6_0_4.zip

    JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等)

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    子程序 读内存字节集, 字节集, 公开, 从内存中读取字节集数据(返回字节集,失败返回0字节长度的空字节集) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 长度, 整数型, , 欲读取内存数据的...

Global site tag (gtag.js) - Google Analytics