Java中的new Operator 和 newInstance()区别
在Java中,new是一个操作符,而newInstance()是一个方法,两者都用于创建对象。如果知道要创建的对象类型,则可以使用new操作符,但如果不知道要创建的对象类型并在运行时传递,则会使用newInstance()方法。
一般来说,new操作符用于创建对象,但如果要确定在运行时创建的对象类型,则无法使用new操作符。在本例中,我们必须使用newInstance()方法。
让我们讨论一下新的操作符。在Java中,对象的创建按列出的3个步骤进行:对象实例化和对象初始化,以及构造函数调用。
Datatype variable;
当我们使用new关键字时,编译器将该变量解释为一个对象
Datatype object = new Constructor();
示例:
// Java Program to Illustrate new Operator
// Importing required classes
import java.util.*;
// Main class
class GFG {
// Main drive method
public static void main(String[] args)
{
// List<Integer> al;
// Ny now al is just a variable
// Now creating object using new operator
List<Integer> al = new ArrayList<>();
// Adding elements to above List
al.add(1);
al.add(4);
al.add(3);
// Printing elements of List
System.out.print(al);
}
}
输出:
[1, 4, 3]
注意:当我们想调用对象而不是变量时,也可以在构造函数中使用它。
现在,如果我们提出newInstance()方法,它存在于java.lang包中Class类的内部。正如我们已经讨论过的,它用于从远程源加载类的地方。
考虑这样一个场景,稍后我们将使用java程序连接到数据库执行。使用JDBC示例可以更清楚地解释这一点。还记得吗,我们使用Class.forName()方法动态加载寄存器,并在其上使用newInstance()方法动态创建对象。
示例:
// Java Program to Demonstrate Working of newInstance()
// Method present inside java.lang.Class
// Class 1
// Class 2
class A {
int a;
}
class B {
int b;
}
// Class 3
// Main class
public class GFG {
// Method 1
// To create an instance of class whose name is
// passed as a string 'c'.
public static void fun(String c)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException
{
// Creating an object of type 'c'
Object obj = Class.forName(c).newInstance();
// Printing the type of object created
System.out.println("Object created for class:"
+ obj.getClass().getName());
}
// Method 2
// Main driver method
public static void main(String[] args)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException
{
// Calling above method over "A"
fun("A");
}
}
Output:
输出说明:forName()方法返回我们调用newInstance()方法的类’ class ‘对象,newInstance()方法将返回我们作为命令行参数传递的类的对象。
- 如果传递的类不存在,则会发生ClassNotFoundException异常。
- 如果传递的类不包含默认构造函数,则会发生InstantionException,因为newInstance()方法会在内部调用特定类的默认构造函数。
- 如果不能访问指定类定义的定义,就会发生IllegalAccessException异常。