关于对象生成的方式

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 {
      
  }

你可能感兴趣的:(thread)