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. windows live writer backup

    windows live writer backup备份:http://wlwbackup.codeplex.com/

  2. Entity Framework 数据生成选项DatabaseGenerated(转)

    在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...

  3. unhandledException详细介绍

    http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html 1. GC 产生的异常,这种异常通常因为Finalize函数中引发未捕获异常 ...

  4. Core Java 3

    p270~p272 1.创建异常类. 步骤:1)定义一个派生于(继承)Exception或者其子类的类. 2)添加两个构造方法:一个是默认构造器,另一个是带有详细描述信息的构造器. import ja ...

  5. #ZLYD团队第二周项目总结

    ZLYD团队第二周项目总结 项目进展 确定项目内容.目标.实现计划 首先确定游戏界面的游戏区域中墙的位置,绘制其图形,并通过其中的方法,返回墙壁的位置等属性. 根据豆子的位置,绘制其图形. 初始化吃豆 ...

  6. zabbix3.2源码升级至3.4

    安装见:https://www.cnblogs.com/LuckWJL/p/9037007.html 一.下载3.4版本安装包 二.停ZabbixServer [root@wcy ~]# /etc/i ...

  7. SpringMVC 原理和流程

    请求到来时,第一个接受这个请求的前端控制器叫DispatcherServlet(这个需要在web.xml中配置),后端控制器叫Controller. 简化版流程: 1.spring mvc将所有的请求 ...

  8. SDN前瞻 该来的来了!SDN 软件定义网络

    SDDC:Software Defined Data Center 软件定义数据中心,全数据中心软件化. 在我们接触SDN概念之前,服务器虚拟化,软件虚拟化技术已经是非常成熟了.如果网络能够被虚拟化, ...

  9. [CDOJ887]轻音乐同好会(跳石头)

    此题已经无法在UESTC上上传,网上只有玄学题解 题目 题目描述 雪菜为了能让冬马参加轻音乐同好会,瞒着春希,和冬马见面. 为了增进感情,雪菜拉着还没缓过神来的冬马进了游戏厅-- 游戏要求两名玩家在排 ...

  10. Android反射机制:手把手教你实现反射

    什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...