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获取网络图片

    方式1 使用urllib库 import urllib.request import os ,stat url = "https://cn.bing.com/th?id=OHR.Lidong ...

  2. Qt之去除窗口的标题栏、通过鼠标移动窗口

    设置标题栏图标,位置与大小示例 #include<QApplication> #include<QWidget> #include<QDebug> #include ...

  3. AHOI/HNOI2017 礼物

    题目链接:戳我 对于题目中给的式子:(大家暂且把\(y_i\)当作\(y_{i+k}\)来看啦qwq) \(\sum_{i=1}^{n}(x_i-(y_i+c))^2\) \(=\sum_{i=1}^ ...

  4. 拉格朗日插值法板子(dls)

    namespace polysum { ; ll a[D],f[D],g[D],p[D],p1[D],p2[D],b[D],h[D][],C[D]; ll calcn(int d,ll *a,ll n ...

  5. SpringBoot导入导出Excel到Mysql

    2018.11.11 10:44:52字数 96阅读 1320 一.包的引用 除了引用SpringBoot基本包之外,还需要引入对Excel操作的包,如下: <dependency> &l ...

  6. oracle字段like多个条件

    写oracle sql时有时候会有 and (字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ...)这样的情况出现,下面提供一个简洁点的解决方案: and REGEXP_LIKE ...

  7. 全面解读php-运算符

    一.运算符的优先级 二.短路作用 本文为袋鼠学习中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11074776.html

  8. NSIS 打包工具使用

    打包工具nsis,打开是在D:\NSIS\VNISEdit文件下VNISEdit.exe. 菜单NSIS->配置打开,编辑器和帮助配置相对应的路径,如下图 然后点击如下图的图标就可以生成安装包

  9. redis源码分析之数据结构--dictionary

    本文不讲hash算法,而主要是分析redis中的dict数据结构的特性--分步rehash. 首先看下数据结构:dict代表数据字典,每个数据字典有两个哈希表dictht,哈希表采用链式存储. typ ...

  10. IE浏览器兼容问题(unset不生效)

    背景色重置:background-color: transparent; width重置:auto height重置:auto