造对象方式
   1.java传统的造对象是通过 new 造对象,
   2.反射造对象 类名.class.newInstance(),
   3.有个什么... 线程造对象
   4.类完整路径造对象Class.forName("").newInstance();
   
   这些方式分别有什么好处?
          大家谈谈有什么优缺点?
   
    
  

解决方案 »

  1.   

     个人概念:
        newInstance()方法最后调的还是new 造对象,形式而已;
      

  2.   

    类完整路径造对象Class.forName("").newInstance(); 不用进行显式的import,class_path中有这个类就行。低耦合的一种机制。
      

  3.   

    有4种显式地创建对象的方式:·用new语句创建对象,这是最常用的创建对象的方式。·运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。· 调用对象的clone()方法。·运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法,
    public class Customer implements Cloneable{ private String name;private int age;
    public Customer(){this("unknown",0);System.out.println("call default constructor");}
    public Customer(String name,int age){this.name=name;this.age=age;System.out.println("call second constructor"); }
    public Object clone()throws CloneNotSupportedException{return super.clone();}
    public boolean equals(Object o){if(this==o)return true;if(! (o instanceof Customer)) return false;final Customer other=(Customer)o;
    if(this.name.equals(other.name) && this.age==other.age)return true;elsereturn false;}
    public String toString(){return "name="+name+",age="+age;}
    public static void main(String args[])throws Exception{//运用反射手段创建Customer对象Class objClass=Class.forName("Customer");Customer c1=(Customer)objClass.newInstance(); //会调用Customer类的默认构造方法System.out.println("c1: "+c1); //打印name=unknown,age=0
    //用new语句创建Customer对象Customer c2=new Customer("Tom",20); System.out.println("c2: "+c2); //打印name=tom,age=20 
    //运用克隆手段创建Customer对象Customer c3=(Customer)c2.clone(); //不会调用Customer类的构造方法System.out.println("c2==c3 : "+(c2==c3)); //打印falseSystem.out.println("c2.equals(c3) : "+c2.equals(c3)); //打印trueSystem.out.println("c3: "+c3); //打印name=tom,age=20 }}以上程序的打印结果如下:call second constructorcall default constructorc1: name=unknown,age=0call second constructorc2: name=Tom,age=20c2==c3 : falsec2.equals(c3) : truec3: name=Tom,age=20从以上打印结果看出,用new语句或Class对象的newInstance()方法创建Customer对象时,都会执行Customer类的构造方法,而用对象的clone()方法创建Customer对象时,不会执行Customer类的构造方法。在Object类中定义了clone()方法,它的定义如下:protected Object clone() throws CloneNotSupportedException{if (!(this instanceof Cloneable)) throw new CloneNotSupportedException();…}Object类的clone()方法具有以下特点:l 声明为protected类型,Object的子类如果希望对外公开clone()方法,就必须扩大访问权限,例如在以上Customer类中,把clone()方法的访问级别改为public。l 如果Java类没有实现Cloneable接口,clone()方法会抛出CloneNotSupportedException异常。Object的子类如果允许客户程序调用其clone()方法,那么这个类必须实现Cloneable接口。l Object类在clone()方法的实现中会创建一个复制的对象,这个对象与原来的对象具有不同的内存地址,不过它们的属性值相同。在本例中,c3由c2克隆而成,它们的内存地址不一样,但属性值相同。除了以上4种显式地创建对象的方式以外,在程序中还可以隐含地创建对象,包括以下几种情况:l 对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传给程序入口main(String args[])方法。l 程序代码中的String类型的直接数对应一个String对象,例如:String s1="Hello";String s2="Hello"; //s2和s1引用同一个String对象String s3=new String("Hello");System.out.println(s1==s2); //打印trueSystem.out.println(s1==s3); //打印false执行完以上程序,内存中实际上只有两个String对象,一个是直接数,由Java虚拟机隐含地创建,还有一个通过new语句显式地创建。l 字符串操作符“+”的运算结果为一个新的String对象。例如:String s1="H";String s2=" ello";String s3=s1+s2; //s3引用一个新的String对象System.out.println(s3=="Hello"); //打印falseSystem.out.println(s3.equals("Hello")); //打印truel 当Java虚拟机加载一个类时,会隐含地创建描述这个类的Class实例,参见第10章的10.2.1节(类的加载)。不管采取哪种方式创建对象,Java虚拟机创建一个对象都包含以下步骤。(1)给对象分配内存。(2)将对象的实例变量自动初始化为其变量类型的默认值。(3)初始化对象,给实例变量赋予正确的初始值。对于以上第三个步骤,Java虚拟机可采用3种方式来初始化对象,到底采用何种初始化方式取决于创建对象的方式。l 如果对象是通过clone()方法创建的,那么Java虚拟机把原来被克隆对象的实例变量的值拷贝到新对象中。l 如果对象是通过ObjectInputStream类的readObject()方法创建的,那么Java虚拟机通过从输入流中读入的序列化数据来初始化那些非暂时性(non-transient)的实例变量。在其他情况下,如果实例变量在声明时被显式初始化,那么就把初始化值赋给实例变量,接着再执行构造方法。这是最常见的初始化对象的方式。
      

  4.   

    第三种不知道
    四也是映射,好处是楼主可以在运行时决定他实例化哪个类,而不用在编译期就定死他,这个优势很有意义的,比如加载jdbc的驱动就是。
      

  5.   

    来自这里
    http://book.csdn.net/bookfiles/49/100491550.shtml
      

  6.   

    java底层东西,顶
    Class.forName("").newInstance(); 这种方式降低耦合
    以上的几种造对象方式,
    从效率上来讲,哪种好一些?UP!