【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.&和&&的联系(共同点): &和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定. 操 ...
随机推荐
- 用Python实现的二分查找算法(基于递归函数)
一.递归的定义 1.什么是递归:在一个函数里在调用这个函数本身 2.最大递归层数做了一个限制:997,但是也可以自己限制 1 def foo(): 2 print(n) 3 n+=1 4 foo(n) ...
- golang之 Array(数组)
目录 一.Array(数组) 二.数组的定义 1. 基本语法 三.数组的初始化 1. 方式一 2. 方式二 3. 方式三 四.数组的遍历 1. 方式一:for循环遍历 2. 方式二:for range ...
- jsp九大内置对象及四个作用域【转】
1.Request对象 该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以 获取用户提交的信息. 当Request对象获取客户提交的汉字字符时,会出现乱码问题,必 ...
- JAVA笔记3-this关键字
1. 2.例题
- JS拖动滑块验证
使用这种验证方法的目的:证明当前的用户不是机器人~防止恶意操作. 实现思路: 1.获取silde滑块(获取元素) 2.为元素注册事件———鼠标点击事件(onmousedown)鼠标点击之后获得当前鼠标 ...
- 6.集成算法boosting----AdaBoost算法
1.提升算法 提升算法实为将一系列单一算法(如决策树,SVM等)单一算法组合在一起使得模型的准确率更高.这里先介绍两种Bagging(代表算法随机森林),Boosting(代表算法AdaBoost-即 ...
- [BZOJ5249][九省联考2018]IIIDX:线段树+贪心
分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...
- AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)
如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...
- Latex生成的.pdf 公式之间隔了几行空白
如题, 解决办法: \vspace{-1.5cm},这个数值根据需要来设置.
- Spring的jsp标签库
1,主要有两个 一个用于渲染HTML表单标签, 这些标签会绑定model中的某个属性 另一个包换了一些工具类标签 2,将表单绑定到模型上 包含了14个标签,海报一个人为用户展现错误的标签,它会将错误信 ...