Java关键字new和newInstance的区别方法

2013-09-06  来源:本站原创  分类:Java  人气:0 

  在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了 一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创 建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

  Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:

class c = Class.forName(“Example”);

  factory = (ExampleInterface)c.newInstance();

  其中ExampleInterface是Example的接口,可以写成如下形式:

String className = "Example";

  class c = Class.forName(className);

  factory = (ExampleInterface)c.newInstance();

  进一步可以写成如下形式:

String className = readfromXMlConfig;//从xml 配置文件中获得字符串

  class c = Class.forName(className);

  factory = (ExampleInterface)c.newInstance();

  上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类 Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

  从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保 证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加 载器,即加载java API的那个加载器。

  现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

  最后用最简单的描述来区分new关键字和newInstance()方法的区别:

  newInstance: 弱类型。低效率。只能调用无参构造。

  new: 强类型。相对高效。能调用任何public构造。

相关文章
  • Java关键字new和newInstance的区别方法 2013-09-06

    在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了 一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类.那么为什么会有两种创 建对象方式?这主要考虑到软件的可伸缩.可扩展和可重用等软件设计思想. Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案. 例如: class c = Class.forName("Example"

  • java.exe和javaw.exe的区别及使用方法 2013-10-15

    这篇文章主要介绍了java.exe和javaw.exe的区别及使用方法,需要的朋友可以参考下 相同点:二者都是Java的虚拟机,用来执行Java程序 区别:javaw.exe运行程序时不会输出控制台信息,如果是双击打开jar文件的话(假设已经设置好了打开方式),那么根本就不会出现控制台窗口,主要用来运行带窗体的应用程序,其中的"w"就是window的意思,所以用它来运行控制台程序时虽不会报错,但不会输出任何结果.而java.exe无论运行控制台程序,还是运行窗体程序都没有任何问题. 情

  • java中extends与implements的区别浅谈 2014-08-05

    java中extends与implements的区别浅谈,需要的朋友可以参考一下 1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支

  • Java中的Vector和ArrayList区别及比较 2014-09-02

    这篇文章主要介绍了Java中的Vector和ArrayList区别及比较,本文从API.同步.数据增长.使用模式4个方面总结了它们之间的不同之处,需要的朋友可以参考下 Vector 和 ArrayList 比较 有时用Vector更好一点,有时用ArrayList更好一点,不能准确容易的给出答案,因为要视具体情况而定,有四个主要考虑的因素: 1:API 2: 同步(synchronization) 3:数据增长(Data growth) 4:使用模式(Usage pattern) 下面分别意义探

  • 实例分析java中重载与重写的区别 2015-01-25

    这篇文章主要介绍了实例分析java中重载与重写的区别,需要的朋友可以参考下 本文以实例详细分析了Java中重载与重写的区别,感兴趣的朋友可以参考一下. 一.重载(Overloading): (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个

  • Java学习笔记(51)--Java8之默认方法(虚拟扩展方法) 2015-05-11

    Java里边的默认方法跟C#里边的扩展方法是一回事儿,只是没有C#做的优雅罢了,因为要修改接口,而C#是新增静态类! 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接

  • java中instanceof和getClass()的区别分析 2013-11-14

    本篇文章介绍了,在java中instanceof和getClass()的区别分析.需要的朋友参考下 class A { } class B extends A { } Object o1 = new A(); Object o2 = new B(); o1 instanceof A => true o1 instanceof B => false o2 instanceof A => true // <================ HERE o2 instanceof B =&

  • java中成员变量与局部变量区别分析 2013-12-09

    这篇文章主要介绍了java中成员变量与局部变量区别,较为详细的分析了java中成员变量与局部变量的功能.用法与区别,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 public class Person { String name; String Sex; int age; double Height; public static void m

  • Java中HashMap和Hashtable的区别浅析 2014-01-09

    这篇文章主要介绍了Java中HashMap和Hashtable的区别浅析,本文总结了6条它们之间的不同之处,需要的朋友可以参考下 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许. HashMap把Hashtable的contains方法去掉了,改

  • Java中Vector与ArrayList的区别详解 2014-04-06

    本篇文章是对Java中Vector与ArrayList的区别进行了详细的分析介绍,需要的朋友参考下 首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复. 3个具体实现类的相关区别如下: 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就

  • 浅析java中print和println的区别 2014-04-13

    以下是对java中print和println的区别进行了详细的分析介绍,需要的朋友可以过来参考下 print()方法在输出括号里指定的字符串后就结束操作,而不再添加回车,光标停留在字符串最后一个字符的右边,println()则是添加回车,光标停在下一行. for(i=1;i<6;i++) println(i); 结果:1 2 3 4 5 for(i=1;i<6;i++) print(i); 结果:12345 "ln"就是"line"去掉元音字母的简写

  • 详细解析Java中抽象类和接口的区别 2014-05-17

    这篇文章主要介绍了Java中抽象类和接口的区别详解,需要的朋友可以参考下 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们

  • java中equals和等号(==)的区别浅谈 2014-06-09

    java中equals和等号(==)的区别浅谈,需要的朋友可以参考一下 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继

  • Java中堆和栈的区别详解 2014-06-16

    这篇文章主要介绍了Java中堆和栈的区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下 当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.Stack.这种情况下,不免让很多人更加费解前面的问题

  • 深入Synchronized和java.util.concurrent.locks.Lock的区别详解 2014-06-18

    本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下 主要相同点:Lock能完成Synchronized所实现的所有功能. 主要不同点:Lock有比Synchronized更精确的线程予以和更好的性能.Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放. synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列 如果实例化

  • Java策略模式的简单应用实现方法 2014-07-03

    这篇文章主要介绍了Java策略模式的简单应用实现方法,需要的朋友可以参考下 在使用图像处理软件处理图片后,需要选择一种格式进行保存.然而各种格式在底层实现的算法并不相同,这刚好适合策略模式.编写程序,演示如何使用策略模式与简单工厂模式组合进行开发. 思路如下: 1.使用interface来定义一个接口,在该接口中定义save()方法: 2.根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口: 3.创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图

  • JAVA中StringBuffer与String的区别解析 2014-07-10

    这篇文章主要介绍了JAVA中StringBuffer与String的区别解析,需要的朋友可以参考下 看到这个讲解的不错,所以转一下 在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作,不可变类. 3.StringBuffer 也是对一串字符进行操作,是可变类. String: 是对象不是原始类型. 为不可变对象,一旦被创建,就不能修改它的值. 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进

  • java中堆和栈的区别分析 2014-09-15

    这篇文章主要介绍了java中堆和栈的区别,分析了Java中堆和栈的原理及使用时的注意事项,需要的朋友可以参考下 堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运

  • java用静态工厂代替构造函数使用方法和优缺点 2014-10-03

    这篇文章主要介绍了java用静态工厂代替构造函数使用方法和优缺点,需要的朋友可以参考下 1. 形式 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 2. 优点: 可以有名称 不一定要创建新对象,可以返回已有的对象 可以返回子类类型的对象(例:java.util.Collections) 让参数化代码变短(例:new HashMap<String,List<String&g

  • java中Hashtable和HashMap的区别分析 2014-11-01

    java中Hashtable和HashMap的区别分析,需要的朋友可以参考一下 1.Hashtable是Dictionary的子类, public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable HashMap: 复制代码 代码如下: public class HashMap<K,V> extends Abstr