Java 对象生命周期
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 对象生命周期相关推荐
- java对象生命周期_Java对象生命周期和类生命周期
原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...
- Java 对象生命周期和类生命周期
Java 对象生命周期 在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段(Unreach ...
- Java对象生命周期
目录 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisible) 4. 不可达阶段(Unreachable) 5. 收集阶段(Collected) 6. ...
- Java中的垃圾回收与对象生命周期
转载自 Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...
- 容器,对象生命周期管理的基石
2019独角兽企业重金招聘Python工程师标准>>> 郑重申明:包括本文在内的很多技术文章,大多出自山外高人,而非Fans. Fans暂时没有能力写作优秀的技术文章,Fans只是转 ...
- SSH学习-Hibernate对象生命周期管理
Hibernate对象就是java中的实体对象,管理就是在实体对象的生命周期内被Hibernate的操作,Hibernate对象的生命周期其实就是实体对象的生命周期(从创建到最后被GC回收),期间对实 ...
- java resume过时方法_面试官没想到,一个 Java 线程生命周期,我可以扯半小时
面试官:你不是精通 Java 并发吗?从基础的 Java 线程生命周期开始讲讲吧. 好的,面试官.吧啦啦啦... 如果要说 Java 线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期 因为 ...
- [js] 说说你对js对象生命周期的理解
[js] 说说你对js对象生命周期的理解 一切皆对象 咱们经常听到JS中"一切皆对象"?有没有问想过这是什么意思?其它语言也有"一切皆对象"之说,如Python ...
- Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;
说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...
最新文章
- 【Data】数据结构之C++程序设计(1)
- 使用leangoo做多团队敏捷开发项目管理
- 驰骋工作流引擎设计系列05 启动流程设计
- 复制内存时检测到可能的io争用条件_这篇高并发服务模型大科普,内部分享时被老大表扬了...
- 2.4.4 案例理解4种事务的隔离级别
- JSP和Servlet的六种中文乱码处理方法
- python怎么创建字符串列表_Python(字符串,列表,元组,字典)
- Linux搭建es集群详细教程(最终版)
- 暖身驱寒的三种瑜伽呼吸法
- 虚拟服务器设置虚拟内存,vmware虚拟机关于内存的一项设置,可以提高你的虚拟机运行效能-虚拟内存怎么设置最好...
- 1226. The Dining Philosophers (Leetcode 1226)
- [转] 记住亦舒的话
- [SSM框架]—Mybatis入门
- ubuntu java 中文_Ubuntu下 JAVA GUI 程序汉字显示为方框解决办法
- el-table合计行
- 无盘启动服务器,无盘启动 服务器设置教程
- ajaxsubmit 的粗浅用法
- 库克和他的“后乔布斯”时代苹果
- 解决方案:用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联
- 禁用计算机桌面方法,win7禁用自动显示桌面功能的方法