java7:核心技术与最佳实践读书笔记——对象生命周期
流程:字节码文件(.class) -> 类加载 -> 类链接 -> 类初始化 -> 对象初始化 -> 对象创建 -> 对象使用 -> 对象回收 。
- 提前解析:在链接时递归地对依赖的所有形式引用都进行解析,性能差。
- 延迟解析:在真正需要一个形式引用才进行解析。
- 创建一个Java类实例对象,如:Student s = new Student();
- 调用一个Java类的静态方法,如:StringUtils.substring();
- 为类或接口中的静态非final域赋值(常量是在编译时进行初始化,放在常量池中,即运行时与该类并无直接关系了)
- 调用Class类和反射API中进行反射操作的方法,如:Class.forName("xxx");
class Animal {
public Animal() {
int average = 30 / getCount();
}
protected int getCount() {
return 4;
}
}
class Dog extends Animal {
private int count;
public Dog(int count) {
this.count = count;
}
public int getCount() {
return count;
} }
public class WrongInit {
public static void main(String[] args) {
Dog dog = new Dog(4); //抛出了除零异常
}
}
- 必须调用父类的finalize方法进行内存回收
- finalize方法中过多的语句,可能导致对象复活,可以使用幽灵引用来代替
class Counter {
private int value = 0; public void increase() {
value++;
} public int getValue() {
return value;
}
} class MutableObject implements Cloneable {
private Counter counter = new Counter(); public void increase() {
counter.increase();
} public int getValue() {
return counter.getValue();
} public Object clone() {
try {
return super.clone();
} catch (Exception e) {
throw new Error(e);
}
}
} public class MutableObjectClone {
public static void cloneObject() {
MutableObject obj = new MutableObject();
obj.increase();// 1
MutableObject cloneObj = (MutableObject) obj.clone();
cloneObj.increase();// 2
obj.increase();// 3
System.out.println(cloneObj.getValue());
} public static void main(String[] args) {
cloneObject(); // 3
}
}
class Counter {
private int value = 0; public void increase() {
value++;
} public int getValue() {
return value;
} public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new Error(e);
}
}
} class MutableObject implements Cloneable {
private Counter counter = new Counter(); public void increase() {
counter.increase();
} public int getValue() {
return counter.getValue();
} public Object clone() {
MutableObject obj = null;
try {
obj = (MultableObject)super.clone();
obj.counter = (Counter)counter.clone();
return obj;
} catch (Exception e) {
throw new Error(e);
}
}
} public class MutableObjectClone {
public static void cloneObject() {
MutableObject obj = new MutableObject();
obj.increase();// 1
MutableObject cloneObj = (MutableObject) obj.clone();
cloneObj.increase();// 2
obj.increase();// 2
System.out.println(cloneObj.getValue());
} public static void main(String[] args) {
cloneObject(); // 2
}
}
public class WriterUser{
public void write(User user) throws IOException{
Path path = Paths.get("user.bin");// 相当于项目目录下的user.bin文件
try(ObjectOutputStream output = new ObjectOutputStream(Files.newOutputStream(path))){
output.writeObject(user);
}
} public static void main(String[] args) throws IOException{
WriterUser writeUser = new WriterUser();
User user = new User("Alex","alex@example.org");
writerUser.write(user)
}
}
public class ReadUser{
public User readUser() throws IOException,ClassNotFoundException{
Path path = Paths.get("user.bin");
try(ObjectInputStream input = new ObjectInputStream(Files.newInputStream(path))){
User user = (User)input.readObject();
return user;
}
} public static void main(String[] args) throws ClassNotFoundException,IOException{
ReadUser readUser = new ReadUser();
User user = readUser.readUser();
System.out.println(user.getName());//Alex
}
}
//在User类中添加如下方法
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
System.out.println("write object start");
//out.defaultWriteObject(); //默认形式,注掉可让邮件信息不序列化
out.writeUTF(getName());
} private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
System.out.println("read object start");
//in.defaultReadObject();
this.name = in.readUTF(); //由于没有存入邮件信息,所以获取邮件信息时将得到null值
}
//多个String的域,按顺序存入,按顺序取出即可
//有了这两个方法,可以对存入信息进行加密,取出来时进行解密
java7:核心技术与最佳实践读书笔记——对象生命周期的更多相关文章
- java7:核心技术与最佳实践读书笔记——类加载
流程:class -> 加载 -> jvm虚拟机 -> 链接 . 一.类加载器概述 1.引出 类加载器也是一个java类,java.lang.ClassLoader类是所 ...
- java7:核心技术与最佳实践读书笔记——字节代码格式
一般流程:开发人员写出java源代码(.java) -> javac(编译器) -> java字节代码(.class) -> 加载 -> java虚拟机(jvm)运行. 1. ...
- 《深入理解Java7核心技术与最佳实践》读书笔记(1.1)---Project Coin介绍
OpenJDK中的Coin项目(Project Coin)的目的就是为了收集对Java语言的语法进行增强的建议.在Coin项目开始之初,曾经广泛地向社区征求提议.在短短的一个月时间内就收到将近70条提 ...
- php核心技术与最佳实践(笔记一)
1.1面向对象的型与本 类是对象的抽象组织,对象是类的具体存在. 1.1.1对象的形 <?php class Person{ public $name; public $gender; publ ...
- PHP核心技术与最佳实践——全局浏览
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
- Thinking In Java读书笔记--对象导论
Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld
<深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...
- 温习《PHP 核心技术与最佳实践》这本书
再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2 ...
- ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...
随机推荐
- Flask-SQLAlchemy操作
Flask-SQLAlchemy SQLAlchemy 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言 ...
- 美国top200药品2
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- 004-log-common-logging,Apache整合日志框架JCL门面框架、JCL+log4j
一.概述 Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具.它提供给中间件/日志工具开发者一个 ...
- Java实现ModbusTCP通信
一个项目,需要用Java实现使用ModbusTCP和硬件设备通信 资料 代码下载 本文的代码和仿真软件:蓝奏云下载 官网资料 Modbus官网 Modbus协议 Modbus技术资源 MODBUS T ...
- Java操作excel_导出与读取(导入)
我自己的jar包下载 一.介绍 常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导 ...
- antd二级联动异步加载
/** * Created by Admin on 2016/9/19. * 批量导入 */ import React, {Component, PropTypes} from "react ...
- Flutter 底部的renderflex溢出
一开始直接使用Scaffold布局,body:new Column 然后模拟器会提示捕获异常: 然后百度了一下Flutter的溢出问题,发现解决办法是使用SingleChildScrollView包 ...
- 【Fiori系列】为什么SAP Fiori活的如此精致
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...
- PJzhang:exiftool图片信息提取工具和短信接口调用工具TBomb
猫宁!!! 作者:Phil Harvey 这是图片信息提取工具的地址: https://sno.phy.queensu.ca/~phil/exiftool/ 网站隶属于Sudbury 中微子天文台,从 ...
- 2019-10-17 李宗盛 spss作业
开放数据库连接是为解决异构数据库之间的数据共享而产生的,现已成为Wosa cwindows开放系统体系结构主要部分和基于Windows环境的一种数据库访问接口标准ODBS被异构数据库访问提供统一接口, ...