Java中不通过构造方法创建对象的方法总结
我们常说,Java是一种面向对象的语言,因而在Java中几乎所有的操作都离不开对象。而在Java语言中,最常见的创建对象的方法是通过对类构造器的调用,除此之外,其实还有下面几种可以创建对象的方法。
1)通过反射机制来创建对象;
class Person{ String name="Jack"; public Person(){ System.out.println("construct"); } public String toString(){return name;} } public class Test{ public static void main(String[] args){ Class classType; try{ classType=Class.forname("Person"); Person p = (Person)classType.newInstance(); System.out.println(p); }cathch(Exception e){ e.printStackTrace(); } } }
程序的运行结果为:
construct
Jack
2)调用对象的clone方法,需要以下几个步骤才能使用clone方法:
(1)实现clone的类首先需要继承Cloneable接口实质上是一个标识接口,没有任何的接口方法,这一点和序列化接口Serializable()很类似。
(2)在类中重写Object类的clone方法。
(3)在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或间接的调用Java.long.Object类中的clone()方法。
实例代码如下:
class Obj implement Cloneable{ private int aInt=0; public Obj(){ System.out.println("construct"); } public int getAint(){return aInt;} public void changeInt(){this.aInt=1; } public Object clone(){ Object o=null; try{ o=(Obj)super.clone(); }catch(CloneNotSuppertedException e){ e.printStackTrace(); } return 0; } } public class Test{ public static void main(String[] args){ Obj a = new Obj(); Obj b = (Obj)a.clone(); b.changeInt(); System.out.println("a:"+a.getAInt()); System.out.println("b:"+b.getAInt()); } }
程序的运行结果为:
construct
a:0
b:1
从以上的程序运行可以看出,在调用a.clone()方法时,系统创建了新的对象,但是没有调用构造方法。
3)通过反序列化的方式创建对象,实例代码如下:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Person implement Serilalizable{ private String name; public Person(){ this.name="lili"; System.out.println("Construct"); } public Stream toString(){return this.name;} public static void main(String args[]){ Person p = new People(); System.out.println(p); ObjectOutputStream oos=null; ObjectInputStream ois = null; try{ FileOutputStream fos =new FileOutputStream("perpke.out"); oos=new ObjectOutputStream(fos); oos.writeObject(p); oos.close(0); } catch(Exception ex){} People pl; try{ FileInputStream fis = new FileInputStream("perple.out"); ois = new ObjectInputStream(fis); p1=(People)ois.readObject(); System.out.println(p); if(p!=p1) System.out.println("two different objecrt") ois.close(); }catch(Exception ex){} } }
程序的运行结果为:
construct
lili
lili
two fifferent object
虽千万人吾往矣...