关于对象生成的方式 thread
程序员文章站
2022-06-08 21:08:58
...
1.使用new关键字生成和不使用new关键字生成对象.
对象生成的方式.
1:new 关键字生成.
Person person = new Man();
这是生成对象最直接的方式.
2:反射方式生成.
使用反射方式生成对象,首先要获得一个Class对象.
获得一个Class对象的方式:
1: Class<?> clazz = Class.forName("mypack.Man");
2: clazz = Thread.currentThread().getContextClassLoader().loadClass("mypack.Man");
包括 ClassLoader的其它能够返回Class对象的方法.
3: clazz = MyClass.class;
4: clazz = object.getClass();
这种方式对现再讨论的意义不大,但这也是获得Class对象的一种方式.
得到Class对象之后调用newInstance()方法就可以直接得到一个对象.当然也可以再获得Constructor的一个对象以生成对象.
Person person = (Person)clazz.newInstance();
3:clone()方法生成.
对于final类,可以调用构造方法生成clone对象;
对于非final类,只能调用super.clone(),所调用的方法也只能是final 型的,如果一个用于继承目的类,则clone()应该throws CloneNotSupportedException,以便当其子类不需要clone功能时,可以关闭.
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
4:序列化接口使用InputStream做为唯一参数生成对象.
流方式构造对象.
自动序列化不太容易看到过程.
手动序列化则更能看到反序列化的过程.
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {
in.defaultReadObject();
this.name = (String)in.readObject();
this.age = in.readInt();
}
此时readObject等同一个公有的构造方法.
实现Serializable的子接口 Externalizable也是一种手动序列化的办法.
与Serializable不同的是,Serializable完全基于二进制流,Externalizable在反序列化时首先调用公共无参构造方法生成实例,
然后调用readExternal方法,通过ObjectInputStream读取信息,返回反序列化的对象.
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {
}
对象生成的方式.
1:new 关键字生成.
Person person = new Man();
这是生成对象最直接的方式.
2:反射方式生成.
使用反射方式生成对象,首先要获得一个Class对象.
获得一个Class对象的方式:
1: Class<?> clazz = Class.forName("mypack.Man");
2: clazz = Thread.currentThread().getContextClassLoader().loadClass("mypack.Man");
包括 ClassLoader的其它能够返回Class对象的方法.
3: clazz = MyClass.class;
4: clazz = object.getClass();
这种方式对现再讨论的意义不大,但这也是获得Class对象的一种方式.
得到Class对象之后调用newInstance()方法就可以直接得到一个对象.当然也可以再获得Constructor的一个对象以生成对象.
Person person = (Person)clazz.newInstance();
3:clone()方法生成.
对于final类,可以调用构造方法生成clone对象;
对于非final类,只能调用super.clone(),所调用的方法也只能是final 型的,如果一个用于继承目的类,则clone()应该throws CloneNotSupportedException,以便当其子类不需要clone功能时,可以关闭.
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
4:序列化接口使用InputStream做为唯一参数生成对象.
流方式构造对象.
自动序列化不太容易看到过程.
手动序列化则更能看到反序列化的过程.
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {
in.defaultReadObject();
this.name = (String)in.readObject();
this.age = in.readInt();
}
此时readObject等同一个公有的构造方法.
实现Serializable的子接口 Externalizable也是一种手动序列化的办法.
与Serializable不同的是,Serializable完全基于二进制流,Externalizable在反序列化时首先调用公共无参构造方法生成实例,
然后调用readExternal方法,通过ObjectInputStream读取信息,返回反序列化的对象.
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {
}