创建对象的几种方法

1、通过new直接创建对象

  Student s = new Student();

2、通过反射创建对象 (reflect)

  

  java的反射机制是指,在运行状态中,对于任意一个类,我们可以获取这个类的属性和方法,对于任意一个对象,我们可以调用这个对象的方法和属性。这种动态获取信息和动态调用对象的方法就是java 的反射机制。

  Class 类,每个class 都会有一个Class对象,当我们完成一个类通过编译之后,就会生成一个.class 文件,在生成的.class 文件中,就会有个Class 对象,用于表示这个类的类型信息。

  获得类的Class 对象的3中方法:

  1,类名.class (任意数据类型,都会有一个class 属性)

  2,Class.forName("java.lang.String"); 类的全路径

  3,类的实例化对象下,有getClass() 方法。

  

  反射创建对象:

  1)创建无参构造对象

    

    类名.class.newInstance(); 就算没有构造方法,也会调用默认的无参构造方法

         Demo newInstance = Demo.class.newInstance();

  2)

    

    和方法1本质相同,一个是使用类名.class ,一个是使用Class.forName("类的全路劲")来获取类的类对象,再通过newInstance()方法创建对象。

         Class<Demo> clazz = (Class<Demo>) Class.forName("Demo");
         Demo newInstance2 = clazz.newInstance();

  3)创建有参构造对象

    

    先获取类的Class 对象,通过类对象获取到指定的构造器,可以是有参,可以是无参,通过指定的构造器,创建对象

      Class<Demo> clazz3 = (Class<Demo>) Class.forName("Demo");
      Constructor<Demo> con = clazz3.getDeclaredConstructor(String.class,String.class);

  

  

  Class对象获取构造器比较:

    Constructor<Demo> con = clazz3.getDeclaredConstructor(String.class,String.class); //能获取到指定参数的构造器,和访问修饰符无关,private,public 所有的可以获取到

    Constructor<?>[] conn = clazz4.getConstructors();//所有public 修饰的构造器

    Constructor<Demo> connn = clazz5.getConstructor(String.class,String.class);//所有public 修饰的带参数的指定构造器

3、clone

  调用clone,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

  前提,必须要实现Cloneable 接口,本地实现 protected native Object clone() throws CloneNotSupportedException;

  Demo clone = (Demo) newInstance.clone();

4、反序列化

  序列化:将堆内存中的java 对象通过某种方式,存储到磁盘上或者传输给其他网络节点,也就是java对象转成二进制。

  反序列化:与序列化相反,再将序列化之后的二进制串再转成数据结构或对象。

  为什么需要做序列化?

  1,网络节点的传输,java 对象需要转成二进制串。

  2,服务器钝化:如果在内存中,一个对象长时间没有被调用,就会将其序列化存储在本地磁盘上,有需要活动的时候,就会现在内存中寻找,找不到,会将磁盘上的二进制再次反序列化成java 对象。可以节省服务器内存。

 

  实现序列化?

  1,需要做序列化的对象的类,必须实现序列化接口:Java.lang.Serializable 接口

 

  通过反序列化创建对象。

posted @ 2020-09-10 10:28  我是小笨笨  阅读(3234)  评论(0)    收藏  举报