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. Python中self的用法详解,或者总是提示:TypeError: add() missing 1 required positional argument: 'self'的问题解决

    https://blog.csdn.net/songlh1234/article/details/83587086 下面总结一下self的用法详解,大家可以访问,可以针对平时踩过的坑更深入的了解下. ...

  2. easyui 动态添加组件 要重新渲染

    做项目时动态添加组件是常有的事,easyui动态添加组件时样式会失效,这是因为这个组件没有经过 easyui的解析器解析, 比如:   <pre name="code" cl ...

  3. IE浏览器如何实现断点续传

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  4. ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.

    docker-compose 的问题 要改环境变量 xed ~/.profile export COMPOSE_HTTP_TIMEOUT=500 export DOCKER_CLIENT_TIMEOU ...

  5. zabbix微信发送消息脚本

    cat /usr/local/zabbix/share/zabbix/alertscripts/sed_messages_weixin.py python2.x #!/usr/bin/env pyth ...

  6. Linux扩展swap分区

    一.将sda磁盘进行分区: 先查看sda磁盘已经使用了多少主分区,如下图所示,主分区已使用3个,所以应选择扩展分区: 二.再将扩展分区进行分区: 三.分区完成后执行partprobe使系统重新识别分区 ...

  7. Linux命令-磁盘管理(二)

    Linux命令-磁盘管理(二) Linux mmount命令 Linux mmount命令用于挂入MS-DOS文件系统. mmount为mtools工具指令,可根据[mount参数]中的设置,将磁盘内 ...

  8. laravel 发送html邮件是a标签中的url不显示问题

  9. 开源EDR(OSSEC)基础篇- 02 -部署环境与安装方式

    https://yq.aliyun.com/articles/683077?spm=a2c4e.11163080.searchblog.9.753c2ec1lRj02l

  10. 让socket端口不被子进程继承

    有两个程序A,B A绑定端口8000,然后用system函数启动程序B,然后再把A杀掉,这个时候再重启A的时候会发现绑定端口失败, 原因是端口被B绑定了,实际上是被继承了,为了避免这种情况,需要对主s ...