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创建对象的五种方式的更多相关文章

  1. java基础之 创建对象的几种方式

    有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...

  2. Java中创建对象的五种方式

    我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...

  3. 【开发笔记】- Java读取properties文件的五种方式

    原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...

  4. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  5. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  6. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  7. Java创建对象的4种方式?

     [Java创建对象的4种方式?] 1)通过new语句实例化一个对象 2)通过反射机制创建对象 3)通过clone()方法创建一个对象  (复制) 4)通过反序列化方式创建对象

  8. Java创建对象的几种方式

    解析:Java创建对象的几种方式(重要):(1) 用new语句创建对象,这是最常见的创建对象的方法.(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Co ...

  9. &和&&的共同点和区别、Java字符含义和Java创建对象的几种方式

    一.&和&&的共同点和区别 1.&和&&的联系(共同点): &和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定. 操 ...

随机推荐

  1. k8s管理pod资源对象(上)

    一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...

  2. maven生成jar包编码问题

    要做一个jar文件供外部调用,此jar的源代码中注释为中文,用maven打包后在其它工程中导入后总不能正常显示中文,记录解决方法如下: 在pom.xml中设置默认编码类型为UTF-8: <pro ...

  3. vue history模式下的微信支付,及微信支付授权目录的填写,处理URL未注册

    微信公众号配置网页授权域名:填写网址域名 微信开发者平台配置url: 访问url:http://www.baidu.com/pay/ment 支付授权目录:http://www.baidu.com/p ...

  4. hive判断数据一个表是否在另一个表中(二)

    1.一个表中的数据不存在另一个表中 2.一个表中的数据 存在另一个表中:

  5. html5 音乐 audio

    手机做小项目,需要添加音乐,做此笔记,依赖jquery,代码如下: <!DOCTYPE html> <html lang="en"> <head> ...

  6. WSL中使用npm install报错

    报错内容类似下面的格式.具体解决方法请看这里:https://github.com/Microsoft/WSL/issues/14 着重关注 https://github.com/Microsoft/ ...

  7. JQuery的deferred.promise()

    jQuery提供的deferred.promise()方法的作用是,在原来的Deferred 对象上返回另一个 Deferred 对象,即受限制的 Promise 对象,受限制的 Promise 对象 ...

  8. JAVA笔记9-多态(动态绑定、池绑定)

    1.动态绑定:执行期间(而非编译期间)判断所引用对象的实际类型,根据实际的类型调用相应方法. 2.多态存在的三个必要条件(同时):继承.重写.父类引用指向子类对象. 这三个条件满足后,当调用父类中被重 ...

  9. qtmaind.lib(qtmain_win.obj) : error LNK2019: 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用

    报错:qtmaind.lib(qtmain_win.obj) : error LNK2019: 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被 ...

  10. <label>标签的相关内容

    ㈠<label>标签的定义与用法 ⑴<label> 标签为 input 元素定义标注(标记). ⑵label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如 ...