七夕面向对象编程,你知道Java有哪些创建对象的方式吗?
时间:2022-07-24
本文章向大家介绍七夕面向对象编程,你知道Java有哪些创建对象的方式吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、用new关键字创建对象,需要使用构造器。
//1、使用关键字new创建对象(没有参数调用无参构造、传入参数调用带参构造)
Girlfriend girlfriend01 = new Girlfriend();
Girlfriend girlfriend02 = new Girlfriend("y", 18);
1234
new 一个对象经过了哪些过程?
2、使用反射机制创建对象,用Class类或Constructor类的newInstance()方法。
当使用Class类里的newInstance()方法,调用的是无参构造方法。 当使用java.lang.reflect.Constructor类里的newInstance方法,调用的是有参构造方法。
1、Class类里的newInstance()
调用的是无参构造方法
image
2、Constructor类的newInstance()方法
调用的是有参构造方法
image
3、通过object类的clone方法
需要实现Cloneable接口,重写object类的clone方法。无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。
image
4、使用反序列化
通过ObjectInputStream的readObject()方法反序列化类当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。在反序列化时,JVM创建对象并不会调用任何构造函数。
image
通过反序列化生成对象的过程主要由以下几个步骤:
1、创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2、 通过对象输入流的readObject()方法读取对象。
image
image
序列化工具类
public class ObjectUtils {
public static <T extends Serializable> T clone(Girlfriend obj) {
T cloneObj = null;
try {
//写入字节流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close();
//分配内存,写入原始对象,生成新对象
ByteArrayInputStream bis = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
//返回新生成的对象
cloneObj = (T) ois.readObject();
bis.close();
out.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return cloneObj;
}
}
1234567891011121314151617181920212223242526
创建对象各方法的代码
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, CloneNotSupportedException {
//1、使用关键字new创建对象(没有参数调用无参构造、传入参数调用带参构造)
Girlfriend girlfriend01 = new Girlfriend();
Girlfriend girlfriend02 = new Girlfriend("y", 18);
//2、使用反射机制创建对象,使用Class的newInstance()调用默认的无参构造
Girlfriend girlfriend03 = Girlfriend.class.newInstance();
//反射机制2,调用带参
Class<?> p1 = Class.forName("com.yky.Girlfriend");
Constructor<?> constructor = p1.getConstructor(String.class, Integer.class);
Girlfriend girlfriend04 = (Girlfriend) constructor.newInstance("k", 18);
System.out.println(girlfriend04);
//3、使用object类的clone方法
Girlfriend girlfriendClone = (Girlfriend) girlfriend04.clone();
System.out.println("girlfriendClone="+girlfriendClone);
//4、使用序列化反序列化生成对象
Girlfriend clone = ObjectUtils.clone(girlfriend04);
System.out.println("clone"+clone);
System.out.println("girlfriend04和反序列化生成的clone相等吗");
System.out.println(clone == girlfriend04);
}
- Leetcode-Easy 543. Diameter of Binary Tree
- Leetcode-Easy 572. Subtree of Another Tree
- 图解javascript this指向什么?
- 2017/6/8-python正则表达式的使用
- 洛谷P1306 斐波那契公约数
- Angular开发实践(二):HRM运行机制
- Angular开发实践(一):环境准备及框架搭建
- 洛谷P2818 天使的起誓
- 连续子数组的最大和
- 10.25解题报告
- React第三方组件5(状态管理之Redux的使用①简单使用)
- JavaScript设计模式与开发实践 - 观察者模式
- React第三方组件4(状态管理之Reflux的使用⑤异步操作)
- Leetcode-Easy 804. Unique Morse Code Words
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 四、学编程语言前,不了解Git,怎么入坑
- 【设计模式系列(三)】彻底搞懂原型模式
- 分享一个可以装逼的开发技巧
- 各位相加,直到得到一个一位的整数
- BFE.dev前端刷题64 - Promise reject的时候自动retry
- 顺序消息管道《Message Pipe》v1.0.1版本发布
- Qt音视频开发23-通用视频控件
- 破解Mariadb5.5密码
- redis学习(七)
- 自己实现一个SAP WebClient UI Repository Information System
- ABAP,Java和JavaScript类的构造函数使用的一些陷阱
- Spring Security如何优雅的增加OAuth2协议授权模式
- 如何将自定义XML视图注入SAP Fiori Elements应用
- SAP UI5控件ID的生成逻辑原理解析
- 如何自定义SAP Spartacus店铺的界面颜色风格