·首先从功能上来说:它们都是创建类的实例
New是一个关键字
NewInstance(),是一个方法
·它们的区别究竟在什么地方呢?
1、newInstance(),采用的是类加载机制,创建一个新的实例
2、New 直接创建一个实例
那为什么会有两种创建实例的方式呢?
主要是考虑到软件的可伸缩、可扩展、可重用的设计思想
注意:使用newInstance()方法时,对象身上一定要有一个默认的无参构造方法;使用类加载机制:可以很灵活的,创建类的实例,以后更换类的时候,无须修改源代码了。有人会说,调用newInstance方法的时候,不是要返回一个实例对象吗,那还不是要修改。。返回的永远都是父类,或者接口,根本不会返回子类,所以无须担心并不是原创 但是感觉很有用 拿来与大家分享 
这些只是一部分 望各位补充 能够写出 更底层的 new原理  让坛子里的刚学习 更理解深入 大牛们就做复习之用吧

解决方案 »

  1.   

    这段时间在回过头 看反射代理的东西 这些东西我觉得 不能深入理解 以后在做java的深入有一定困难的
      

  2.   

    在不同场合用的.如果你明确知道自己要什么,直接new.
    如果是从配置中加载的,用newInstance.使用newInstance好处是不需改代码,可以随意更改实现.
      

  3.   


    其实这些 很多做过开发一年多的人 都清楚 我发这个帖子的本意 是希望大牛能够 深入剖析 new 
      

  4.   

    new有什么好剖析的也是将类装载-连接-初始化然后new,然后dup new出来的引用,然后用invokespecial调用其中一个引用的<init>
      

  5.   


    我其实想说的 就是这块  装载-连接-初始化  new在这个过程做了这些东西 
    但是 能不能像 反射这样理解  我现在也对这块有点迷糊的
      

  6.   

    分场合使用。newInstance其实从jvm角度考虑是把new 分解成两步,加载类,实例化。但他只能调用无参构造。
    new的话,相对高效些。但是就跟楼主说的一样。当发生变化时不像newInstance那样无需修改源码。个人感觉newInstance在接口编程方面是不二的选择。原因就是他的优点。
      

  7.   

    new是关键字,也是操作符(或者说是运算符),而newInstance是方法
    new如果类没有被加载的话会加载类,而newInstance是必须发生在加载类之后,即发生在Class.forName等等之后
    new是针对即知类型的类的操作,编译期会查看new后面接着的类是否存在,而newInstance在编译期并不检测类是否存在,在运行期中如果出错会抛出异常
      

  8.   

    new 和 newInstance都不可避免的有类的  装载-连接(验证-准备-解析)-初始化这个步骤看 JLS-JavaSE7.pdf 第五章(有中文版 Java虚拟机规范(Java SE 7).pdf ) 或者 《深入java虚拟机》 第八章,全部讲的这个问题,不是三言两语能说清的
      

  9.   

    new是关键字,也是操作符(或者说是运算符),而newInstance是方法
    new如果类没有被加载的话会加载类,而newInstance是必须发生在加载类之后,即发生在Class.forName等等之后
    new是针对即知类型的类的操作,编译期会查看new后面接着的类是否存在,而newInstance在编译期并不检测类是否存在,在运行期中如果出错会抛出异常楼上的说很有道理 这些也是 newInstance的执行机制 
      

  10.   

    表象,Class#newInstance调用的就是构造方法,与new无异
      

  11.   


    这个 其实我是想 得到这个Class#newInstance调用的就是构造方法,与new无异  结果 我自己也是这样认为的 但是 不确定
      

  12.   

    做一些大的软件进。要求有一定的拓展功能。你不能抓一个类就用NEW对象吧。如果都是NEW的话。以后拓展的时候就要全部进行修改了。
    所以通常为这些以后可能进行修改的类新建一个接口。让以后的具有相同的功能类都继承这个接口。
    再写一个配置文件。里面存放了继承那个接口的类的名称。通过读取这个配置文件。获取相应的类名字,
    最后再编写一个类。里面存放的方法都是Static方法。通过调用这些方法。返回相应类的实例。返回的类型都为接口类型。
      

  13.   

    InvocationHandler  这两天 我也是在别的地方看的 自己也遇到这个问题  public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {这个Object proxy
    不能在这个方法里面调用  会造成 死循环  也望各位能够解惑
      

  14.   

    最后再编写一个类。里面存放的方法都是Static方法。通过调用这些方法。返回相应类的实例。返回的类型都为接口类型。newInstance()就是在这时发挥作用的。。
      

  15.   


    这个 只是 对比 new 与 newInstance的优点和 使用 这些我目前都知道这样做的
    我只是 想更深入的了解 和学习 new的底层机制  其实就是头脑缺个模型图 不能像 newInstance那样清晰
      

  16.   

    一般都是使用new的比较多。  
      

  17.   

    缺什么样的模型图?知道newInstance,就应该知道new,一个是用高级语言代码的方法的形式表示出来,一个是封装好的操作符形式表现出来
    LZ可以看看C++方面的一些关于操作符重载的知识
      

  18.   


    关于楼主问的“那为什么会有两种创建实例的方式呢?”我的理解是:new是创建对象的基本方式,
    而Class.newInstance() 完全是为了让Class这个类的功能完善,不管你的什么类加载机制,反射机制,实际都是Class这个类的功能,我觉得可以简单地把它理解为功能,所以我觉得没必要讨论new 和 newInstance()的什么关系!而且sun的jdk source里的注释是这样开关的    /**
         * Creates a new instance of the class represented by this <tt>Class</tt>
         * object.  The class is instantiated as if by a <code>new</code>
         * expression with an empty argument list.  The class is initialized if it
         * has not already been initialized.
         .............
         */
        public T newInstance() 其中这一句“The class is instantiated as if by a <code>new</code>
         expression with an empty argument list ”
    说明他们做同样的事情。
      

  19.   


    可能我说的比较抽象  我觉得缺少头脑中有种模型 可能我对new 的理解比较浅
      

  20.   


        /**
         * Creates a new instance of the class represented by this <tt>Class</tt>
         * object.  The class is instantiated as if by a <code>new</code>
         * expression with an empty argument list.  The class is initialized if it
         * has not already been initialized.
         .............
         */
        public T newInstance()
    学习 拿走了
      

  21.   

    自己 看东西  还是不够仔细 多谢 各位InvocationHandler 这两天 我也是在别的地方看的 自己也遇到这个问题   public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {这个Object proxy
    不能在这个方法里面调用 会造成 死循环 也望各位能够解惑这个帮看下吧
      

  22.   

    几乎所有的框架都有用反射机制
    也就是用:newInstance()的方法。
      

  23.   


    人家读代码,你非要猜代码。有些东西深入剖析有收获,有些纯属浪费时间,为什么sql要用select from 而不用choose in?人家就这么规定的,有什么可以再研究的?人家要工作要生活,解答问题也没有收入,为什么要陪个十万个为什么去玩?你的问题在java doc里基本可以得到全部的解答,为什么要别人帮你翻译一遍?
      

  24.   

    知识其实就是一层层在剥的 刚开始会写 helloworld 慢慢深入 不是每个人天生就会 编码 就知道怎么写的 
    其实我不喜欢在论坛了 问一些实际的问题  这些问题 往往自己基础好就可以解决的  但是思想的问题 就不一样的
      

  25.   

    看过帖子之前,newInstance这个东西只是在做jdbc连接时用过,因此又去查了一下。Class.forName(xxx.xx.xx);
    Class aClass = Class.forName(xxx.xx.xx);
    Object anInstance = aClass.newInstance();我觉得newInstance这个方法就是用在不明确你要的对象是什么,所以才使用这个方法。
    而new的话,是已经明确了你要的什么,所以可以直接创建对象。这是我的理解。
      

  26.   

    new是把Class的类加载到内存中进行对象的创建,而在使用newInstance方法时,说明Class类已经在内存中存在了,而只是利用这个Class类的模板来创建一个对象而已。两者还是有差别的。在创建数据库连接器时候我们都需要注册驱动,这就是把驱动类加载到内存中,而你不能new一个驱动类吧!希望对你有帮助。
      

  27.   

    比如有一大堆子类继承某个父类,或者实现了某个接口,那么用newInstance就很容易的从类名的字符串创建出具体的对象了(用父类或者接口的来表达)。如果以后增删了子类,这部分代码也不需要修改如果用new的话只能写一大堆switch case或者字符串比较了,而且以后子类有所修改的话还得改代码
      

  28.   

    我觉得newInstance()最多用的地方是反射那里吧,当你创建一个动态的类,继而要创建这个类的对象的时候用newInstance(),而new是直接你知道了某个类,这个类是固定的时候用的吧
      

  29.   

    Java的设计者心说,其实就是很多时候不能用new,就整一个newInstance出来。哈哈哈。。
    上面的话仅供玩笑。无视之。
    其实讨论问题应该有一个范围,有一个范围就好讨论了。比如说,从概念上来讲,一切都是对象嘛,Class也是对象,那这个对象当然应该能创建自己的实例。再从场合上来讲,不是所有情况下都明确知道该new谁,是动态变化的。再比如说从技术实现上讲。等等等。。个人愚见,仅供参考
      

  30.   

    从我的角度来看,主要是运用的场景不同。如果我明确知道创建的对象是什么,我会直接NEW,但由于现在很多都靠配置来完成,那就会用newInstant...