java中创建对象4种方式
1 new关键字
这是最简单最常用的创建对象方式,包括无参的和有参的构造函数。
Student student = new Student();
2 反射(2种)
这两种newInstance的方法就是我们所说的反射。Class的newInstance方法内部是调用Constructor的newInstance方法。其实这也是众多框架Spring、Hibernate、Struts等使用后者的方式。
2.1 Class类的newInstance方法
newInstance方法调用无参的构造器创建对象的。
Student student = (Student)Class.forName(className).newInstance(); Student stu = Student.class.newInstance();
2.2 Constructor类的newInstance方法
该方式和Class类的newInstance方法很像。java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。
Constructor<Student> constructor = Student.class.getInstance();
Student stu = constructor.newInstance();
2.3 区别
两种newInstance方法区别:
- 从包名看,Class类位于java的lang包中,而构造器类是java反射机制的一部分。
- 实现上,Class类的newInstance只触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法。(查看第二部分的源码第2 条解释,)
- Class类的newInstance需要其构造方法是共有的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。这点可以从上面源码的第1 条解释可以看出。
- Class类的newInstance抛出类构造函数的异常,而构造器类的newInstance包装了一个InvocationTargetException异常。这是封装了一次的结果。
即Class类本质上调用了反射包构造器类中无参数的newInstance方法,捕获了InvocationTargetException,将构造器本身的异常抛出。
3克隆Clone()
无论何时我们调用一个对象的clone方法,JVM都会创建一个新的对象,同时将前面的对象的内容全部拷贝进去。事实上,用clone方法创建对象并不会调用任何构造函数。需要注意的是,要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。
原型模式就是采用的这种方式:
Student stu2 = <Student>stu.clone();
4 反序列化
Java 中常常进行 JSON 数据跟 Java 对象之间的转换,即序列化和反序列化。
当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口,虽然该接口没有任何方法。
ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj"));
Student stu3 = (Student)in.readObject();
值得一说的时,很多时候一些优秀的第三方库可以帮我们很容易地实现序列化和反序列化。比如Jackson 、 Gson。下面是一个Jackson 的一个例子:
public static <T> T readValue(String content, TypeReference valueType) {try {ObjectMapper objectMapper = new ObjectMapper();return (T) objectMapper.readValue(content, valueType);} catch (Exception e) {throw new RuntimeException(e);}}
总的看来,除了使用new关键字之外的其他方法全部都是转变为invokevirtual(创建对象的直接方法) 创建。使用被new的方式转变为两个调用,new和invokespecial(构造函数调用)
java中创建对象4种方式相关推荐
- 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- Java中创建对象的几种方式
Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...
- Java中创建对象的四种方式
为什么80%的码农都做不了架构师?>>> Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.l ...
- [转载] java中创建对象的方式
参考链接: 用Java创建对象的不同方法 java中的4种创建对象的方式: 在这片博文中和大家简单分享一下常见的几种创建java对象的方式 1.使用 new 的方式,这也是我们最常见的一种方式 我们以 ...
- 绝,Java 中创建对象的 5 种方法!
我们日常生活中会创建很多对象,但是这个对象和你理解的那么对象不一样,因为作者不是女娲,不能造人.作者只是程序员,他只能在 Java 中创建对象. 那么我问你一个问题,你知道 Java 中如何创建对象吗 ...
- java读文件几种方式_java中读取文件的方式有哪几种
java中读取文件的方式有哪几种 发布时间:2020-06-19 13:36:48 来源:亿速云 阅读:135 作者:鸽子 读取文件有多种方式,基于传统的输入流方式或基于nio的Buffer缓冲对象和 ...
- java数组初始化的方式,java中初始化数组的方式有几种
java中初始化数组的方式有几种 发布时间:2020-06-01 16:12:45 来源:亿速云 阅读:153 作者:鸽子 三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 ...
- java弹出对话框的三个命令_Java中弹出对话框中的几种方式
Java中弹出对话框中的几种方式 2019年12月06日 阅读数:20 这篇文章主要向大家介绍Java中弹出对话框中的几种方式,主要内容包括基础应用.实用技巧.原理机制等方面,希望对大家有所帮助. 1 ...
- 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...
java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...
最新文章
- jqMobi(App Framework)入门学习(一)
- 浅谈php7 引入的“??“和 “?:“的区别
- 《Python知识手册》,高清pdf免费获取
- 区块链开发公司 注重用户的价值才是企业归宿
- 又栽了?苹果侵犯高通三项专利需赔偿3100万美元
- matlab 捕食者和猎物,[转载]与“猎物-捕食者模型”有关的模拟题
- vs如何包含库文件以及头文件
- Java游戏程序设计教程 4.5打砖块游戏
- msvcrtd.lib(crtexew.obj):error LNK2019:无法解析的外部符号WinMain@16,该符号在函数___tmainCRTStartup中被引用
- mysql获取记录的插入时间_mysql 自动记录数据插入及最后修改时间
- Pytorch框架--知识图谱可视化展示
- 随机生成游戏用户昵称(nodejs版本)(含机器人头像,金币等)
- 2dlda人脸识别 matlab,利用2DPCA和2DLDA在ORL人脸数据库上做的人脸识别实验
- “大灯”到底指近光灯还是远光灯?
- python 对excel的函数操作_自动化报表(3)
- linux awk 排序,利用Shell中awk和sort命令合并同类数据后并依据某一列进行排序
- 管理感悟:听课与收获
- 计算机组成原理常见题(四)
- lc1819——枚举因数并判定,两种解法
- 移动端如何在前端阻止input框获得焦点时手机键盘的弹出