Java创建对象的六种方法-权当记录一下
1 简介
Java是面向对象的编程语言,只要使用它,就需要创建对象。Java创建对象有六种方法,实际常用的不会这么多,这里权当是记录一下。
2 六种方法
(1)使用new关键字
Pumpkin p1 = new Pumpkin();
(2)反射之Class类newInstance()
Pumpkin p2 = Pumpkin.class.newInstance();
(3)反射之Constructor类的newInstance()
Pumpkin p3 = Pumpkin.class.getDeclaredConstructor().newInstance();
(4)Object对象的clone方法
Pumpkin p4 = (Pumpkin) p1.clone();
注意Object类的clone方法是protected的,在Override的时候,可以改成public,这样让其它所有类都可以调用。
注意浅拷贝和深拷贝。
(5)反序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.bin"));
oos.writeObject(p1);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.bin"));
Pumpkin p5 = (Pumpkin) ois.readObject();
ois.close();
必须要实现Serializable接口;
需要注意哪些字段可序列化,哪些字段不会被序列化,如何控制;
注意serialVersionUID的作用;
了解Externalizable的不同之处。
(6)使用Unsafe类
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
Pumpkin p6 = (Pumpkin) unsafe.allocateInstance(Pumpkin.class);
很少用的方法,一般不用了解这个方法。
3 示例代码
示例代码如下:
package com.pkslow.basic;
import sun.misc.Unsafe;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class CreateObject {
public static class Pumpkin implements Cloneable, Serializable {
public Pumpkin(){
System.out.println("Constructor called");
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, CloneNotSupportedException, IOException, ClassNotFoundException, NoSuchFieldException {
System.out.println("---start---");
System.out.println("(1) new");
Pumpkin p1 = new Pumpkin();
System.out.println("(2) Class newInstance");
Pumpkin p2 = Pumpkin.class.newInstance();
System.out.println("(3) Constructor newInstance");
Pumpkin p3 = Pumpkin.class.getDeclaredConstructor().newInstance();
System.out.println("(4) clone");
Pumpkin p4 = (Pumpkin) p1.clone();
System.out.println("(5)Serialization");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.bin"));
oos.writeObject(p1);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.bin"));
Pumpkin p5 = (Pumpkin) ois.readObject();
ois.close();
System.out.println("(6) Unsafe");
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
Pumpkin p6 = (Pumpkin) unsafe.allocateInstance(Pumpkin.class);
System.out.println("---end---");
}
}
输出结果如下:
---start---
(1) new
Constructor called
(2) Class newInstance
Constructor called
(3) Constructor newInstance
Constructor called
(4) clone
(5)Serialization
(6) Unsafe
---end---
所以会执行构造函数的有:new关键字、两种反射;
不会执行构造函数的有:clone、序列化、Unsafe类。
4 总结
要学会生产对象,也要学会管理对象、回收对象。
欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。
Java创建对象的六种方法-权当记录一下的更多相关文章
- JAVA 创建对象4种方法
java创建对象的几种方式 博客分类: java (1) 用new语句创建对象,这是最常见的创建对象的方法.(2) 运用反射手段,调用java.lang.Class或者java.lang.refl ...
- 【Java 基础】java 创建对象时重写方法
TransactionLock mockLock = new TransactionLock() { public boolean lock(String id) { return true; } p ...
- Java创建对象的几种方法
有时候,也可能碰到这样面试题,如: Java创建对象有哪几种方法? 除了new之外,java创建对象还有哪几种方式? 本文结合例子,给出几种Java创建对象的方法,Here we go~~~~ 使用n ...
- Java读取Properties文件的六种方法
使用J2SE API读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法示例: InputStream in = lnew BufferedIn ...
- 关于这两天研究Java打印pdf方法的记录
这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...
- (转)java判断string变量是否是数字的六种方法小结
java判断string变量是否是数字的六种方法小结 (2012-10-17 17:00:17) 转载▼ 标签: it 分类: 转发 1.用JAVA自带的函数 public static boolea ...
- 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...
- java加载properties文件的六种方法总结
java加载properties文件的六种方法总结 java加载properties文件的六中基本方式实现 java加载properties文件的方式主要分为两大类:一种是通过import java. ...
- java创建对象的5种方法
java是面向对象的,所以在使用中经常会去创建对象,而我们一般创建对象只会使用new关键字去创建,这里给大家总结一下在java中创建对象的5中方法: 使用new关键字 } → 调用了构造函数 使用Cl ...
随机推荐
- CocoaPods应用于iOS项目框架管理方案
- Apache与PHP的配置
Listen 表示端口号 ServerName 表示域名 <Directory 路径> 表示默认开放的路径 <IfModule dir_module> 表示默认显示的文件名 & ...
- AJ学IOS 之小知识之xcode6自动提示图片插件 KSImageNamed的安装
AJ分享,必须精品 一:首先看效果 KSImageNamed是让XCode能预览项目中图片的插件 很牛逼,据说写这个插件的牛人在日本~ 主要针对imageNamed:方法 效果如图: 安装: 首先需要 ...
- Mitmproxy教程
本文是一个较为完整的 mitmproxy教程,侧重于介绍如何开发拦截脚本,帮助读者能够快速得到一个自定义的代理工具. 本文假设读者有基本的 python 知识,且已经安装好了一个 python 3 开 ...
- 关于 System.IO.File.Exists 需要注意的事项
各位: .NET Framework 本省在设计的时候,他对于异常没有完全做到抛出,这样可能会有很多意想不到的问题. 比如 你在asp.net 应用程序中判断文件是否存在,这个文件可能是一个共 ...
- ThinkPHP6.0学习笔记-验证器
验证器 By:Mirror王宇阳 验证器定义 验证器的使用,必须定义它:系统提供了一条命令直接生产一个验证器类: php think make:validate User 自动再应用目录下生成一个va ...
- Docker常用命令--ps/attach/run
ps查看container 若查看正在运行的container docker ps 查看所有的container docker ps -a run启动容器 第一次启动container docker ...
- ES6新增的 Set 和 WeakSet 是什么玩意?在此揭晓
现在的章节内容会更加的紧密,如果大家看不懂可以先去看以前的文章,当然看了的忘了,也可以去看一下,这样学习后面的内容才会更加容易. 什么是Set结构 Set是ES6给开发者带来的一种新的数据结构,你可以 ...
- c++<ctime>中常用函数
先说一下c++标准库并没有提供所谓的日期类型,而是继承了c的日期类型 <cmath>里面有些常用的函数,比如计时函数clock().获取系统时间的函数time(),下面就具体的介绍一下 1 ...
- windows 删除非法目录
用PHP写错了路径,创建了非法目录,提示不存在该项目 复制下面 添加为批处理文件 DEL /F /A /Q \\?\%1RD /S /Q \\?\%1 将文件移入这个文件