转自:http://blog.csdn.net/onlyzhangqin/archive/2008/04/16/2297394.aspx
在初始化一个类,生成一个实例的时候,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() 方法都是用于创建对象的,但是它们之间有着本质的区别。理解这两者的区别对于 Java 编程尤其重要。 首先,new 关键字是 Java 的一个保留字,用于创建一个新的对象。例如,`A ...
Java 中 newInstance() 方法和 new 关键字的区别 Java 中的对象创建方式有多种,newInstance() 方法和 new 关键字是其中两种常用的方式。但是,它们之间有着本质的区别。本文将详细介绍 newInstance() 方法和 new ...
在Java编程语言中,创建对象是十分常见的操作,而`newInstance()`方法和`new`关键字则是实现这一目的的两种主要方式。它们之间的区别不仅在于一个是方法调用,另一个是语言提供的关键字,更深层次的区别体现在它们的...
在Java编程语言中,`new`关键字和`newInstance()`方法都是用来创建对象的,但它们在使用场景和工作原理上存在显著差异。了解这些差异对于编写高效、灵活的代码至关重要。 首先,`new`关键字是Java语法的一部分,...
`extends`关键字用于继承,允许一个类继承另一个类的属性和方法。 **示例:** ```java public class Animal { public void makeSound() {} } public class Dog extends Animal { @Override public void ...
Java中的`new`关键字是创建和初始化对象的关键操作,它在编程中扮演着至关重要的角色。当我们使用`new`关键字时,实际上是执行了以下几个步骤: 1. 分配内存:Java虚拟机(JVM)在堆内存中为新对象分配所需的空间。...
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来声明一个变量、方法或类为不可变的。在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量...
在 Java 中,有两种创建对象的方式:使用 new 关键字和使用 newInstance() 方法。 * 使用 new 关键字创建对象:例如 `String sName = new String();` * 使用 newInstance() 方法创建对象:例如 `factory = ...
在文档内容中,存在一些由于OCR扫描导致的错误和遗漏,例如“javaAPInewInstance()”应该理解为“java.lang.Class.newInstance()”,“ClassforName()”应该是“Class.forName()”。这些语法错误需要在实际阅读文档...
在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...
### Java中new关键字的用法详解 ...同时,`newInstance()`方法提供了另一种创建对象的方式,在某些场景下更加灵活和强大。正确选择和使用这两种方式可以帮助开发者更好地管理Java应用程序中的对象创建过程。
static修饰的变量和方法可以用类名直接调用,而不需要创建对象实例。static修饰的代码块只执行一次,优先级仅低于静态变量。 static关键字的作用 static关键字的作用可以分为以下几个方面: 1. 静态变量:static...
然而,`newInstance()`和`new`关键字有明显的区别。`new`是关键字,直接创建新对象,而`newInstance()`是方法,它需要先通过`Class.forName()`加载类,然后才能实例化。使用`newInstance()`时,类必须已经被加载并且...
在 Java 中,我们可以使用“this”关键字来调用当前类的方法,以避免名称冲突和提高代码可读性。 “this”关键字是 Java 中的一个重要概念,它可以用来引用当前类的实例变量、调用当前类的构造函数、返回当前类的...
Java Class.forName()用法和newInstance()方法原理解析 Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求...
- 使用反射机制创建对象是指使用 Java 的反射机制来创建对象,通过 Class 对象的 newInstance() 方法可以创建对象,如 `Class<?> c1 = Class.forName("org.whb.test.Person"); Object obj = c1.newInstance();` - ...
在本文中,我们将深入探讨`final`关键字在不同场景下的使用,包括变量、方法、参数和类的修饰。 1. **变量** - **局部变量**:在方法或代码块内部声明的`final`变量必须在声明时或者在其作用域内首次使用前赋值,...
在Java中,反射主要用于在运行时分析类、接口、字段和方法的信息,使得我们可以在不知道对象具体类型的情况下创建和操作对象。下面我们将详细探讨Java反射的基本方法及其应用。 一、获取类信息 1. `Class` 类:...