Java 对象生命周期

一直对Java对象的实例化、对象、对象的引用、堆 栈存放的内容迷惑不解。看了 Java编程思想,理解似乎又深了一层。

对象和对象的引用

Java 编程思想中,把对象的引用比喻成了遥控器,对象比喻成了电视机,我们是通过遥控器操作电视机的,想改换频道或者调整声音,只需要操作遥控器就可以了,并且遥控器可以独立于电视机存在,也就是说你有一个引用,并不需要一定要与一个对象进行关联,例如
String s;
但这里所创建的只是引用,并不是对象。如果此时像s发送一个消息,就会返回 一个运行时错误。这是因为此时s实际上没有与任何事物相关联。

在这里,引用可以理解为定义的变量或者对象名,实际要操作的内容才是对象,对象是类的一个个体,具体的实现样式,比如有Student 类,Student jack; jack 只是Student的对象的一个名字,Student 有很多属性和方法,如果不实例化jack,jack将不可能操作Student的对象的任何属性和方法,只有实例化,赋给jack一个对象,才能操作类中的属性和方法。

对象存储的位置

程序运行时,对象是怎样进行放置安排的呢?特别是内存怎么分配的,有5个不同的地方可以存放数据:

  • 1) 寄存器:位于CPU中,根据需求进行分配,不能直接进行控制,也感觉不到它的运行;
  • 2) 堆栈:就是所谓的栈,在内存中,通过堆栈指针可以从处理器那里获得直接支持,堆栈指针若向下移动则分配新的内存,若向上移动,则释放内存。存储速度仅次于寄存器。创建程序时,java 系统必须知道存储在堆栈内所有项的确切生命周期,以便于上下移动堆栈指针
  • 3)堆:一种通用的内存池,用于存放所有的java对象,堆不同于堆栈的好处是,编译器不需要知道存储的数据在堆里存放多长时间。因此在堆里分配内存有很大的灵活性。当需要一个对象时,只需要用new写一行简单的代码,当执行代码时会自动的在堆里进行内存分配。
  • 4)常量存储:常量值通常存放在程序代码内部
  • 5)非内存存储区域:如果数据完全存活于程序之外,那么他可以不受程序的任何控制,在程序没有运行时也可以存储,两个基本的例子是流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。持久化对象被存放于磁盘上,因此即使程序终止,它人可以保持自己的状态,在需要时又可以恢复成常规的对象。

综上可以大致理解为:new创建的对象存在于堆中,这块内存区域也是经常会溢出的地方,你不知道会执行多少次new;堆栈(栈)中存放得是常量及基本数据类型 和 对象的引用,因为这些都是固定的,程序运行之前就知道的大小。

静态属性和非静态属性

用Static修饰的成员变量或方法是静态成员变量和静态方法。静态成员变量和静态方法都是属于类的,生命周期跟类一直同在。对象的成员变量在对象被创建时生成,对象消亡时消亡,如下的例子:
在C中想最终调用A中aPrint方法,中间经过了B,B中的两个变量是通过实例化赋值的,在访问C时,b对象已经无效了,name 和 id 的值也随着无效了,所以最终运行的结果提示:name = null

代码块

例如:

package com.test;public class A {private String name;private String id;public A(String name, String id) {this.name = name;this.id = id;}public void aPrint(){System.out.println("name = " + name);}
}
package com.test;public class B {public String name;public String id;public B(String name, String id) {this.name = name;this.id = id;}A a = new A(name,id);public void bPrint() {a.aPrint();}
}
package com.test;public class C {public static void main(String[] args) {String name = "test";String id = "123";B b = new B(name,id);b.bPrint();}
}


把 B 改成

package com.test;public class B {public static String name;public String id;public B(String id) {this.id = id;}A a = new A(name,id);public void bPrint() {a.aPrint();}
}

在运行结果:

name的值不在为空。

Java 对象生命周期相关推荐

  1. java对象生命周期_Java对象生命周期和类生命周期

    原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...

  2. Java 对象生命周期和类生命周期

    Java 对象生命周期 在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段(Unreach ...

  3. Java对象生命周期

    目录 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisible) 4. 不可达阶段(Unreachable) 5. 收集阶段(Collected) 6. ...

  4. Java中的垃圾回收与对象生命周期

    转载自   Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...

  5. 容器,对象生命周期管理的基石

    2019独角兽企业重金招聘Python工程师标准>>> 郑重申明:包括本文在内的很多技术文章,大多出自山外高人,而非Fans. Fans暂时没有能力写作优秀的技术文章,Fans只是转 ...

  6. SSH学习-Hibernate对象生命周期管理

    Hibernate对象就是java中的实体对象,管理就是在实体对象的生命周期内被Hibernate的操作,Hibernate对象的生命周期其实就是实体对象的生命周期(从创建到最后被GC回收),期间对实 ...

  7. java resume过时方法_面试官没想到,一个 Java 线程生命周期,我可以扯半小时

    面试官:你不是精通 Java 并发吗?从基础的 Java 线程生命周期开始讲讲吧. 好的,面试官.吧啦啦啦... 如果要说 Java 线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期 因为 ...

  8. [js] 说说你对js对象生命周期的理解

    [js] 说说你对js对象生命周期的理解 一切皆对象 咱们经常听到JS中"一切皆对象"?有没有问想过这是什么意思?其它语言也有"一切皆对象"之说,如Python ...

  9. Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;

    说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...

最新文章

  1. 【Data】数据结构之C++程序设计(1)
  2. 使用leangoo做多团队敏捷开发项目管理
  3. 驰骋工作流引擎设计系列05 启动流程设计
  4. 复制内存时检测到可能的io争用条件_这篇高并发服务模型大科普,内部分享时被老大表扬了...
  5. 2.4.4 案例理解4种事务的隔离级别
  6. JSP和Servlet的六种中文乱码处理方法
  7. python怎么创建字符串列表_Python(字符串,列表,元组,字典)
  8. Linux搭建es集群详细教程(最终版)
  9. 暖身驱寒的三种瑜伽呼吸法
  10. 虚拟服务器设置虚拟内存,vmware虚拟机关于内存的一项设置,可以提高你的虚拟机运行效能-虚拟内存怎么设置最好...
  11. 1226. The Dining Philosophers (Leetcode 1226)
  12. [转] 记住亦舒的话
  13. [SSM框架]—Mybatis入门
  14. ubuntu java 中文_Ubuntu下 JAVA GUI 程序汉字显示为方框解决办法
  15. el-table合计行
  16. 无盘启动服务器,无盘启动 服务器设置教程
  17. ajaxsubmit 的粗浅用法
  18. 库克和他的“后乔布斯”时代苹果
  19. 解决方案:用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联
  20. 禁用计算机桌面方法,win7禁用自动显示桌面功能的方法

热门文章

  1. 从法律角度谈NFT艺术品的创作、持证和铸造权益的有效性
  2. Android_仿苹果数字键盘以及判断信用卡有效期的Editext
  3. Centos7-SELINUX setenforce 0命令导致无法访问vsftpd
  4. bzoj2149拆迁队 斜率优化dp+分治
  5. Springboot 中配置 druid 监控
  6. 计算机毕业设计Java-ssm便行顺风车出行系统源码+系统+数据库+lw文档
  7. Python零基础快速制作足球游戏
  8. matlab 二分法求最优解
  9. Type-c手机OTG取电充电边充边传数据方案知晓
  10. 做出来的app,如何推广?