java4中创建内对象的方法
在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)的实例变量。
在其他情况下,如果实例变量在声明时被显式初始化,那么就把初始化值赋给实例变量,接着再执行构造方法。这是最常见的初始化对象的方式。
最新文章
- ExpressJs server中Router的设置
- Python数据结构——散列表
- 用Ajax调用web api,解决URL太长的问题;
- log4N配置方式
- java - import *
- static \ const \ volatile 的含义
- ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
- Java入门(1) —— 变量、运算符、分支结构和程序员思维的理解
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
- 跟踪测试 DbContext ,向"不是真正的 ORM" 说拜拜
- 【转载】IIC SPI UART串行总线
- javascript模块化编程-立即执行函数(IIFE)
- UTF-8格式txt文件读取字节前三位问题
- py2和py3的区别总结
- .net core json配置相关用法
- modbus tcp 入门详解
- CSS 杂记
- 使用Vuejs编写单js组件
- andorid 反编译
- jvm 语法糖