【Java基础】Java创建对象的五种方式
Java中创建(实例化)对象的五种方式
1、用new语句直接创建对象,这是最常见的创建对象的方法。

2、通过工厂方法返回对象,如:String str = String.valueOf(23);

3、调用对象的clone()方法。

4、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance();

5、通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

源代码
package main.java; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; /**
* @description 创建对象工具类
* @author Lints
* @date 2019/12/4 10:35
* @sine version 1.0
*/
public class CreateObjectUtil { // 导读:不想看大片注释的朋友,在IDEA中,把光标移至块注释内,按 'Ctrl' + '-' 折叠注释。 /**
* @description 通过new关键字创建(实例化)对象
* @param
* @return java.lang.Object
* @author Lints
* @date 2019/12/4 10:36
* @sine version 1.0
*/
public static Object createObjectByNewKeyword(){
String strObj = new String("我是new关键字创建的字符串对象");
return strObj;
} /**
* @description 通过工厂方法创建(实例化)对象
* @param
* @return java.lang.Object
* @author Lints
* @date 2019/12/4 10:36
* @sine version 1.0
*/
public static Object createObjectByFactoryMethod() {
String strObj = String.valueOf(12345);
return strObj;
} /**
* @description 通过Object类的clone()方法复制得到对象。
* @param
* @return java.lang.Object
* @author Lints
* @date 2019/12/4 10:38
* @sine version 1.0
*/
public static Object createObjectByCloneMethod() {
CreateObjectDemo srcObj = new CreateObjectDemo();
Object cloneObj = null;
try {
cloneObj = srcObj.clone();
} catch (CloneNotSupportedException e) {
// todo handle the exception
}
return cloneObj;
} /**
* @description 根据Java反射机制获取对象
* @param
* @return java.lang.Object
* @author Lints
* @date 2019/12/4 15:06
* @sine version 1.0
*/
public static Object createObjectByReflection() {
Object obj = null;
try {
obj = CreateObjectDemo.class.newInstance();
// obj = String.class.newInstance();
} catch (Exception e) {
// todo handle the exception
}
return obj;
} /**
* @description 通过反序列化机制读取文件对象
* @param
* @return java.lang.Object
* @author Lints
* @date 2019/12/4 17:56
* @sine version 1.0
*/
public static Object createObjectBySerialization() { File objFile = new File("CreateObjectDemo.obj");
CreateObjectDemo obj = new CreateObjectDemo();
CreateObjectDemo objFromFile = null;
System.out.println();
System.out.println("---序列化前---");
System.out.println("我是obj对象:" + obj);
System.out.println("我是objFromFile反序列化对象:" + objFromFile); // JDK1.7后,可以使用try-with-recources优雅关闭流对象
try (
// 输出流,写对象到磁盘
FileOutputStream fos = new FileOutputStream(objFile);
ObjectOutputStream oos = new ObjectOutputStream(fos); // 输入流,从磁盘读对象到内存
FileInputStream fis = new FileInputStream(objFile);
ObjectInputStream ois = new ObjectInputStream(fis);
) {
oos.writeObject(obj);
objFromFile = (CreateObjectDemo) ois.readObject();
System.out.println();
System.out.println("---反序列化后---");
System.out.println("我是obj对象:" + obj);
System.out.println("我是objFromFile反序列化对象:" + objFromFile);
} catch (Exception e) {
// todo handle exception
}
return objFromFile;
} }
CreateObjectUtil.java
package main.java; import java.io.Serializable; /**
* @description 实现克隆标记接口的demo类.
* @author Lints
* @date 2019/12/4 15:05
* @sine version 1.0
*/
public class CreateObjectDemo implements Serializable, Cloneable { // 导读:不想看大片注释的朋友,在IDEA中,把光标移至注释块内,按 'Ctrl' + '-' 折叠注释。 // 每个类都有特定的序列化ID
private static final long serialVersionUID = -8634864503012834475L; /**
* @description 重写Object类的clone方法提升Clone方法的访问权限
* @param
* @return java.lang.Object
* @author Lints
* @date 2019/12/4 11:26
* @sine version 1.0
*/
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
} // main方法,JVM程序入口
public static void main(String[] args) {
String strObj1 = (String) CreateObjectUtil.createObjectByNewKeyword();
String strObj2 = (String) CreateObjectUtil.createObjectByFactoryMethod(); CreateObjectDemo cloneObj = (CreateObjectDemo) CreateObjectUtil.createObjectByCloneMethod();
CreateObjectDemo reflectionObj = (CreateObjectDemo) CreateObjectUtil.createObjectByReflection(); System.out.println("通过new关键字创建的对象:"
+ strObj1.getClass().getName() + "@" + Integer.toHexString(strObj1.hashCode()));
System.out.println("通过工厂方法创建的对象:"
+ strObj2.getClass().getName() + "@" + Integer.toHexString(strObj2.hashCode()));
System.out.println("通过clone方法克隆的对象:" + cloneObj);
System.out.println("通过反射机制获取的对象:" + reflectionObj.toString()); CreateObjectDemo obj = (CreateObjectDemo) CreateObjectUtil.createObjectBySerialization();
}
}
CreateObjectDemo.java
结果展示

【Java基础】Java创建对象的五种方式的更多相关文章
- java基础之 创建对象的几种方式
有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...
- Java中创建对象的五种方式
我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...
- 【开发笔记】- Java读取properties文件的五种方式
原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- Java中创建(实例化)对象的五种方式
Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...
- 五种方式让你在java中读取properties文件内容不再是难题
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- Java创建对象的4种方式?
[Java创建对象的4种方式?] 1)通过new语句实例化一个对象 2)通过反射机制创建对象 3)通过clone()方法创建一个对象 (复制) 4)通过反序列化方式创建对象
- Java创建对象的几种方式
解析:Java创建对象的几种方式(重要):(1) 用new语句创建对象,这是最常见的创建对象的方法.(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Co ...
- &和&&的共同点和区别、Java字符含义和Java创建对象的几种方式
一.&和&&的共同点和区别 1.&和&&的联系(共同点): &和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定. 操 ...
随机推荐
- 乱花渐入迷人眼------从解决jqueryEasyUI上传插件提交ajax请求谈网页调试
由于要给格斗男神写搏击俱乐部ERP系统,就要用到jquery Easyui插件规范数据和表单的录入,其中一项功能就是上传商品图片, 而且是在datagrid-detailview中使用filebox完 ...
- js/html 判断ie浏览器版本
1.html判断浏览器:<!--[if !IE]><!-->除ie外都可以识别<!--<![endif]--><!--[if IE]>所有ie可以 ...
- EF Core命令
新建 Add-Migration init Update-Database init 修改model后,执行迁移的命令 更新数据库 每次更新都要{update}修改 Add-Migration {up ...
- Beyong Compare 2.4.10刷新剩余日期bat批处理文件
@echo off % start )(window.close)&&exit REG DELETE "HKCU\Software\Scooter Software\Beyo ...
- python re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None:而re.search匹配整个字符串,直到找到一个匹配. #!/usr/bin/python impor ...
- TTTTTTTTTTTTTTTTTT POJ 2724 奶酪消毒机 二分匹配 建图 比较难想
Purifying Machine Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5004 Accepted: 1444 ...
- [JZOJ6247]【NOI2019模拟2019.6.27】C【计数】
Description n<=200000 Solution 比赛时没做出这道题真的太弟弟了 首先我们从小到大插入数i,考虑B中有多少个区间的最大值为i 恰好出现的次数不太好计算,我们考虑计算最 ...
- python爬取智联招聘职位信息(单进程)
我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...
- A.Equivalent Prefixes(ST算法)
Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 ...
- Unity3D_(游戏)甜品消消乐01_游戏基础界面
甜品消消乐游戏 (脚本源码在游戏UI设计最下方) 三消游戏,存在L型消除有一点小Bug,当甜品在饼干附近消除时会清除饼干 饼干作为游戏障碍物时不可移动的,多块饼干并排时会挡住甜品掉落 发现消除类游戏的 ...