æ4ç§æ¾å¼å°å建对象çæ¹å¼ï¼
1.ç¨newè¯å¥å建对象ï¼è¿æ¯æ常ç¨çå建对象çæ¹å¼ã
2.è¿ç¨åå°æ段ï¼è°ç¨Java.lang.Classæè java.lang.reflect.Constructorç±»çnewInstance()å®ä¾æ¹æ³ã
3.è°ç¨å¯¹è±¡çclone()æ¹æ³ã
4.è¿ç¨ååºååæ段ï¼è°ç¨java.io.ObjectInputStream对象çreadObject()æ¹æ³.
ä¸é¢æ¼ç¤ºäºç¨åé¢3ç§æ¹å¼å建对象çè¿ç¨ã
以ä¸ç¨åºçæå°ç»æå¦ä¸ï¼
call second constructor
call default constructor
c1: name=unknown,age=0
call second constructor
c2: name=Tom,age=20
c2==c3 : false
c2.equals(c3) : true
c3: name=Tom,age=20
ä»ä»¥ä¸æå°ç»æçåºï¼ç¨newè¯å¥æClass对象çnewInstance()æ¹æ³å建Customer对象æ¶ï¼é½ä¼æ§è¡Customerç±»çæé æ¹æ³ï¼èç¨å¯¹è±¡çclone()æ¹æ³å建Customer对象æ¶ï¼ä¸ä¼æ§è¡Customerç±»çæé æ¹æ³ãï¼åºå«ï¼
é¤äºä»¥ä¸4ç§æ¾å¼å°å建对象çæ¹å¼ä»¥å¤ï¼å¨ç¨åºä¸è¿å¯ä»¥éå«å°å建对象ï¼å æ¬ä»¥ä¸å ç§æ åµï¼
1.对äºjavaå½ä»¤ä¸çæ¯ä¸ªå½ä»¤è¡åæ°ï¼Javaèææºé½ä¼å建ç¸åºçString对象ï¼å¹¶æå®ä»¬ç»ç»å°ä¸ä¸ªStringæ°ç»ä¸ï¼åæ该æ°ç»ä½ä¸ºåæ°ä¼ ç»ç¨åºå ¥å£main(String args[])æ¹æ³ã
2.ç¨åºä»£ç ä¸çStringç±»åçç´æ¥æ°å¯¹åºä¸ä¸ªString对象ï¼ä¾å¦ï¼
æ§è¡å®ä»¥ä¸ç¨åºï¼å åä¸å®é ä¸åªæ两个String对象ï¼ä¸ä¸ªæ¯ç´æ¥æ°ï¼ç±Javaèææºéå«å°å建ï¼è¿æä¸ä¸ªéè¿newè¯å¥æ¾å¼å°å建ã
3.å符串æä½ç¬¦â+âçè¿ç®ç»æ为ä¸ä¸ªæ°çString对象ãä¾å¦ï¼
4.å½Javaèææºå è½½ä¸ä¸ªç±»æ¶ï¼ä¼éå«å°å建æè¿°è¿ä¸ªç±»çClasså®ä¾.
使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student();
使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = <Student>stu.clone();这也是原型模式的应用。
使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();