java对象是通过加载、链接、初始化三大步骤来完成对象的创建及初始化。那么接下来就说一下java创建实例对象的方式有哪几种。其中,new对象、静态工厂方法和反射机制三种方式是需要通过调用类的构造方法进行对象的实例化,通过反序列化和clone()方法的方式是不需要调用构造方法进行对象的实例化。
1.通过new方式创建对象,例如:shape shape = new shape(); 该种方式是工作中最为常见的一种实例化方式。
2.通过静态工厂方法创建实例对象,例如:integer.valueof(1); 其实质也是通过new的方式调用构造方法来创建实例对象。
3.通过反射机制创建实例对象,通过java.lang.class或java.lang.reflect.constructor的newinstance()方法来创建实例对象,newinstance()方法创建实例对象的类必须含有无参构造方法。
- 通过class.forname(“”).newinstance()或t.class.newinstance()创建实例对象;
public static void test() { try { class clazz = class.forname("bean.user"); //或 class clazz = user.class; user user = (user) clazz.newinstance(); } catch (instantiationexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } catch (classnotfoundexception e) { e.printstacktrace(); } }
- 通过constructor.newinstance()创建实例对象;
public static void test() { try { constructor<user> con = user.class.getconstructor(); user user = con.newinstance(); } catch (nosuchmethodexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } catch (instantiationexception e) { e.printstacktrace(); } catch (invocationtargetexception e) { e.printstacktrace(); } }
4.通过反序列化方式创建实例对象。通过i/o技术的反序列化方式创建实例对象的类必须实现java.io.serializable接口。objectoutputstream可以通过网络或本地获取已序列化对象的二进制字节码进行反序列化来创建该实例对象。通过反序列化方式创建实例对象不需要调用构造方法。
- 创建user类并实现serializable接口
/** * 创建user类并实现serializable接口 */ public class user implements serializable { private string name; public string getname() { return name; } public void setname(string name) { this.name = name; } }
/** * 通过objectoutputstream将对象序列化字节流持久化到本地硬盘 */ public static void serialization() { try { user user = new user(); objectoutputstream out = new objectoutputstream(new fileoutputstream(new file("/users/xxx/desktop/user.txt"))); out.writeobject(user); out.close(); } catch (ioexception e) { e.printstacktrace(); } } /** * 通过objectinputstream从本地硬盘中获取对象字节流反序列化并创建实例对象 */ public static void deserialization() { try { objectinputstream in = new objectinputstream(new fileinputstream(new file("/users/xxx/desktop/user.txt"))); user user = (user) in.readobject(); in.close(); user.setname("serializable"); system.out.println(user.getname()); } catch (ioexception e) { e.printstacktrace(); } catch (classnotfoundexception e) { e.printstacktrace(); } }
5.通过调用对象的clone()方法创建实例对象。通过clone()方法创建实例对象需要实现java.lang.cloneable接口并且可以通过复写object类的clone()方法来实现对象的深拷贝。调用clone()方法时jvm先为新创建的对象分配内存,然后将调用clone()方法的对象复制给新创建的对象。通过clone()方法创建实例对象不需要调用构造方法。
- 创建user类并实现cloneable接口,并重写object类的clone()方法
/** * 创建user类并实现cloneable接口,并重写object类的clone()方法 */ public class user implements cloneable { private string name; public string getname() { return name; } public void setname(string name) { this.name = name; } @override protected object clone() throws clonenotsupportedexception { return super.clone(); } }
- 通过clone()方法创建新的user实例对象
public static void main(string[] args) { try { user cloneuser = new user(); user copyuser = (user) cloneuser.clone(); copyuser.setname("lisi"); system.out.println(copyuser.getname()); } catch (clonenotsupportedexception e) { e.printstacktrace(); } }
写在最后
到此这篇关于一文盘点java创建实例对象的方式的文章就介绍到这了,更多相关java创建实例对象内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论