在java程序中,对象可以被显式地或者隐式地创建.
四种显式的创建对象的方式:
     ● 用new语句创建对象
     ● 运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
     ● 调用对象的clone()方法
     ● 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.

一、new

  使用java的关键字new来创建对象实例。构造函数链中的所有构造函数都会被自动调用。

Java代码:

   CreateInstance instance = new CreateInstance ();

二、clone

构造函数不被自动调用。

  Java代码:

   public class CreateInstance implements Cloneable{

    public CreateInstance getInstance() throws CloneNotSupportedException{

     return (CreateInstance) this.clone();

}

}

  如果需要复制上面的那个obj指向的对象实例时,调用new CreateInstance().getInstance()方法就ok了。

但是为什么不直接使用new CreateInstance().clone()呢?

JDK中Object# clone()方法的原型是:protected native Object clone() throws  CloneNotSupportedException; 方法修饰符是protected,而不是public。

这种访问的不可见性使得我们对Object#clone()方法不可见。所以,必需重写Object的clone方法后才能使用。

Java代码:

   public class CreateInstance implements Cloneable{

    public CreateInstance clone throws CloneNotSupportedException{

     return (CreateInstance) super.clone();

}

}

值得注意的是 :如果需要使用clone方法,必需实现java.lang.Cloneable接口,否则会抛出java.lang.CloneNotSupportedException。

另外clone方法所做的的操作是直接复制字段的内容,换句话说,这个操作并不管该字段对应的对象实例内容。

像这样字段对字段的拷贝(field to field copy)就成为"浅拷贝",clone方法所做的正是"浅拷贝"。

三、newInstance

利用java.lang.Class类的newInstance方法,则可根据Class对象的实例,建立该Class所表示的类的对象实例。

创建CreateInstace类的对象实例可以使用下面的语句(这样需要一个已经存在的对象实例)。

CreateInstance instance = CreateInstance.class.newInstance();

或者使用下面的语句(只需要存在相应的.class文件即可)

CreateInstance instance = (CreateInstance)Class.forname("com.create.instance.CreateInstance").newInstance();

如果包下不存在相应.class文件,则会抛出ClassNotFoundException。

注意 :newInstance创建对象实例的时候会调用无参的构造函数,所以必需确保类中有无参数的构造函数,否则将会抛出java.lang.InstantiationException异常。

无法进行实例化。

四、 readObject()

如果对象是通过ObjectInputStream类的readObject()方法创建的,那么Java虚拟机通过从输入流中读入的序列化数据来初始化那些非暂时性(non-transient)的实例变量。
在其他情况下,如果实例变量在声明时被显式初始化,那么就把初始化值赋给实例变量,接着再执行构造方法。这是最常见的初始化对象的方式。

最新文章

  1. ExpressJs server中Router的设置
  2. Python数据结构——散列表
  3. 用Ajax调用web api,解决URL太长的问题;
  4. log4N配置方式
  5. java - import *
  6. static \ const \ volatile 的含义
  7. ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
  8. Java入门(1) —— 变量、运算符、分支结构和程序员思维的理解
  9. 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
  10. 跟踪测试 DbContext ,向"不是真正的 ORM" 说拜拜
  11. 【转载】IIC SPI UART串行总线
  12. javascript模块化编程-立即执行函数(IIFE)
  13. UTF-8格式txt文件读取字节前三位问题
  14. py2和py3的区别总结
  15. .net core json配置相关用法
  16. modbus tcp 入门详解
  17. CSS 杂记
  18. 使用Vuejs编写单js组件
  19. andorid 反编译
  20. jvm 语法糖

热门文章

  1. 随便说说removeFromSuperview方法
  2. hdu2025java字符题
  3. static inner class 什么时候被加载
  4. 利用AWS简单存储服务(S3)托管网站
  5. CentOS 6.7编译安装PHP7
  6. PHP一个最简单的CMS内容管理系统
  7. 功能点分析法FPA笔记
  8. MongoDB的Document操作
  9. oracle的学习 第二节:创建数据表
  10. C++Primer学习笔记(二、基础)