1、使用new关键字 } → 调用了构造函数

这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

2、使用Class类的newInstance方法 } → 调用了构造函数

使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。

3、使用Constructor类的newInstance方法 } → 调用了构造函数

和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。

4、使用clone方法 } → 没有调用构造函数

无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

5、使用反序列化 } → 没有调用构造函数

当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口

代码demo

 package javatest.demo;

 import java.io.Serializable;

 public class PrintTest implements Cloneable, Serializable {

     public static final long serivalVersion = 1L;

     private String name;

     public PrintTest() {
System.out.println("this is Constructor");
} public void hello() {
System.out.println("hello ");
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PrintTest other = (PrintTest) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} @Override
public String toString() {
return "PrintTest [name=" + name + "]";
} @Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

测试类

 package javatest.demo;

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor; /**
* 创建一个类的几种方法?
*
* @author BrokenColor
* @date 2018年6月7日
*/
public class InstanceDemo { public static void main(String[] args) { // 使用new关键字} → 调用了构造函数
System.out.println("=================new关键字:");
PrintTest printtest1 = new PrintTest();
printtest1.setName("printtest1");
System.out.println(printtest1 + ",hashcode:" + printtest1.hashCode());
printtest1.hello();
try {
// 使用Class类的newInstance方法} → 调用了构造函数
System.out.println("=========Class类的newInstance方法:");
PrintTest printtest2 = (PrintTest) Class.forName("javatest.demo.PrintTest").newInstance();
//或者可以
// PringtTest pringttest2 = PringtTest.class.newInstance();
printtest2.setName("printtest2");
System.out.println(printtest2 + ",hashcode:" + printtest2.hashCode());
printtest2.hello(); // 使用Constructor类的newInstance方法 } → 调用了构造函数
System.out.println("=======Constructor类的newInstance方法:");
Constructor<PrintTest> constructor = PrintTest.class.getConstructor();
PrintTest printTest3 = (PrintTest) constructor.newInstance();
printTest3.setName("printTest3");
System.out.println(printTest3 + ",hashcode:" + printTest3.hashCode());
printTest3.hello(); // 使用clone方法 } → 没有调用构造函数
System.out.println("=======使用clone方法 } → 没有调用构造函数");
PrintTest printTest4 = (PrintTest) printTest3.clone();
printTest4.setName("printTest4");
System.out.println(printTest4+",hashcode:"+printTest4.hashCode()); //序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));
out.writeObject(printTest4);
out.close(); // 使用反序列化 } → 没有调用构造函数
System.out.println("===========使用反序列化");
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
PrintTest printTest5 = (PrintTest) in.readObject();
printTest5.setName("printTest5");
System.out.println(printTest5+",hashcode:"+printTest5.hashCode());
printTest5.hello(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

运行类

运行结果:

java创建类的5种方式的更多相关文章

  1. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  2. 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

    这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...

  3. javascript创建类的6种方式

    javascript创建类的7种方式 一 使用字面量创建 1.1 示例 var obj={}; 1.2 使用场景 比较适用于临时构建一个对象,且不关注该对象的类型,只用于临时封装一次数据,且不适合代码 ...

  4. Java创建Timestamp的几种方式

    1.java创建Timestamp的几种方式 Timestamp time1 = new Timestamp(System.currentTimeMillis()); Timestamp time2 ...

  5. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  6. java创建线程的三种方式及其对比

    第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...

  7. AJPFX总结java创建线程的三种方式及其对比

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

  8. java创建线程的三种方式及其对照

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行 ...

  9. Java创建线程的第二种方式:实现runable接口

    /*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在 ...

随机推荐

  1. Java压缩多个文件并导出

    controller层: /** * 打包压缩下载文件 */ @RequestMapping(value = "/downLoadZipFile") public void dow ...

  2. ref out 区别

    1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字.以满足匹配. 3.out适 ...

  3. cocos2dx 3.x 蒙板 遮罩 点击圆功能

    //注册触摸 EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); listener->onT ...

  4. uwsgi手动安装时报错ValueError: invalid literal for int() with base 10: '32_1'

    安装uwsgi,安装步骤如下 wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz tar zxvf uwsgi-latest.ta ...

  5. Win10取消开机密码方法

    1.开始菜单输入命令“netplwiz” 2.进入到用户账户页面,选择所需账户,把“要使用本计算机,用户必须输入用户名和密码”单选框取消勾选,点击应用 3.输入密码进行 这个时候会提示输入两次该账户的 ...

  6. Spring的一些面试题(转)

    一.spring工作原理: 1.spring mvc的所有请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.2.DispatcherServlet ...

  7. SQL学习笔记二之MySQL的数据库操作

    阅读目录 一 系统数据库 二 创建数据库 三 数据库相关操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限 ...

  8. CSS3 页面中展示邮箱列表点击弹出发送邮件界面

    CSS3 页面中展示邮箱列表点击弹出发送邮件界面 代码: <!DOCTYPE html> <html> <head> <meta charset=" ...

  9. POJ 1047 Round and Round We Go

    https://vjudge.net/problem/POJ-1047 题意: 给一个整数,它的长度为n,从1开始一直到n和该整数相乘,判断每次结果是否和原来的整数是循环的. 思路: 大整数的乘法. ...

  10. 癌症免疫细胞治疗知识:CAR-T与TCR-T的区别在哪里?--转载

    肿瘤免疫治疗,实际上分为两大类.一种把肿瘤的特征“告诉”免疫细胞,让它们去定位,并造成杀伤:另一种是解除肿瘤对免疫的耐受/屏蔽作用,让免疫细胞重新认识肿瘤细胞,对肿瘤产生攻击(一般来说,肿瘤细胞会巧妙 ...