在Java中创build对象有哪些不同的方法?
前些天和同事谈过这件事。
显而易见的是使用构造函数,但还有什么其他方法?
在java中有四种不同的方法来创build对象:
  A。 使用new关键字 
 这是在java中创build对象最常用的方法。 几乎99%的对象是以这种方式创build的。 
  MyObject object = new MyObject(); 
  B。 使用Class.forName() 
 如果我们知道类的名字,如果它有一个公共的默认构造函数,我们可以用这种方式创build一个对象。 
 MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance(); 
  C。 使用clone() 
  clone()可用于创build现有对象的副本。 
 MyObject anotherObject = new MyObject(); MyObject object = (MyObject) anotherObject.clone(); 
  D. 使用object deserialization 
 对象反序列化只不过是从序列化的forms创build一个对象。 
 ObjectInputStream inStream = new ObjectInputStream(anInputStream ); MyObject object = (MyObject) inStream.readObject(); 
你可以从这里阅读
有多种方式:
-  通过Class.newInstance。
-  通过Constructor.newInstance。
- 通过反序列化(使用大多数派生的不可序列化的基类的无参数构造函数)。
-  通过Object.clone( 不调用构造函数 )。
- 通过JNI(应该调用一个构造函数)。
-  通过任何其他方法来为你调用一个new的。
-  我想你可以描述类加载创build新的对象(如interned String)。
- 一个字面数组作为声明初始化的一部分(数组没有构造函数)。
-  数组中的“varargs”( ...)方法调用(数组的构造函数)。
- 非编译时间常量string连接(在典型实现中恰好产生至less四个对象)。
-  引发由运行时创build和抛出的exception。 比如throw null;或"".toCharArray()[0]。
- 哦,当然,和原始的拳击(除非caching)。
- JDK8应该有lambda(本质上简洁的匿名内部类),隐式转换为对象。
-  为了完整性(和PaŭloEbermann),还有一些关于new关键字的语法。
在Java语言中,创build对象的唯一方法是通过调用它的构造函数,无论是显式的还是隐式的。 使用reflection结果调用构造函数方法,反序列化使用reflection调用构造函数,工厂方法将调用包装到构造函数中以抽象出实际构造,克隆类似地是一个包装的构造函数调用。
 是的,您可以使用reflection来创build对象。 例如, String.class.newInstance()会给你一个新的空String对象。 
克隆和反序列化 。
也可以使用
  Object myObj = Class.forName("your.cClass").newInstance(); 
这应该注意,如果你是新来的java,每个对象都从Objectinheritance
受保护的本机对象clone()抛出CloneNotSupportedException;
而且,您可以将数据反序列化为一个对象。 这不通过类的构造函数!
更新 :谢谢汤姆指出你的评论! 迈克尔也进行了实验。
它通过派生的最不可序列化的超类的构造函数。
而当这个类没有无参数构造函数时,反序列化时会抛出一个InvalidClassExceptionexception。
 请参阅汤姆的答案,为所有案件的完整处理;-) 
  是否有任何其他方式创build一个对象,而不使用java中的“新”关键字 
其他方法,如果我们是穷尽的。
- 在Oracle JVM上是Unsafe.allocateInstance(),它在不调用构造函数的情况下创build一个实例。
-  使用字节码操作,你可以添加代码到新anewarray,multianewarray,newarray或new。 这些可以使用诸如ASM或BCEL的库来添加。 Oracle的Java随附了一个bcel版本。 再次,这不会调用构造函数,但您可以调用构造函数作为一个单独的调用。
reflection:
 someClass.newInstance(); 
反思也会为你做的工作。
 SomeClass anObj = SomeClass.class.newInstance(); 
是另一种创build类的新实例的方法。 在这种情况下,您还需要处理可能抛出的exception。
-  使用new操作符(从而调用构造函数)
-  使用reflectionclazz.newInstance()(它再次调用构造函数)。 或者通过clazz.getConstructor(..).newInstance(..)(再次使用构造函数,但是可以select哪一个)
通过调用对象类的构造函数来总结答案的一个主要方法。
更新:另一个答案列出了两种不涉及使用构造函数的方式 – 非集中化和克隆。
有一种types的对象,它不能由普通的实例创build机制(调用构造函数)构造: 数组 。 数组是用…创build的
  A[] array = new A[len]; 
要么
  A[] array = new A[] { value0, value1, value2 }; 
正如Sean在评论中所说的,这在语法上类似于构造函数调用,在内部它不比分配和零初始化(或者在第二种情况下使用显式内容进行初始化)的内存块有一些头部来指示types和长度。
将parameter passing给可变参数方法时,也会隐式创build(并填充)一个数组。
第四种方法是
  A[] array = (A[]) Array.newInstance(A.class, len); 
当然,克隆和反序列化也在这里工作。
标准API中有很多创build数组的方法,但实际上它们都使用了一种(或多种)方法。
你也可以克隆现有的对象(如果它实现了Cloneable)。
 Foo fooClone = fooOriginal.clone (); 
在Java中有五种不同的方法来创build对象:
1.使用`new`关键字:
这是在Java中创build对象最常用的方法。 几乎99%的对象是以这种方式创build的。
 MyObject object = new MyObject();//normal way 
2.使用工厂方法:
 ClassName ObgRef=ClassName.FactoryMethod(); 
例:
 RunTime rt=Runtime.getRunTime();//Static Factory Method 
3.通过使用克隆概念:
 通过使用clone() ,可以使用clone()来创build现有对象的副本。 
 MyObjectName anotherObject = new MyObjectName(); MyObjectName object = anotherObjectName.clone();//cloning Object 
4.使用`Class.forName()`:
如果我们知道类的名字,如果它有一个公共的默认构造函数,我们可以用这种方式创build一个对象。
 MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance(); 
例:
 String st=(String)Class.forName("java.lang.String").newInstance(); 
5.使用对象反序列化:
对象反序列化只不过是从序列化的forms创build一个对象。
 ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream ); MyObjectName object = (MyObjectNmae) inStream.readObject(); 
在Java中有五种不同的方法来创build一个对象,
  1.使用new关键字 →构造函数被调用 
 Employee emp1 = new Employee(); 
  2.使用Class →构造函数的newInstance()方法调用 
 Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee") .newInstance(); 
它也可以写成
 Employee emp2 = Employee.class.newInstance(); 
  3.使用Constructor →constructor的newInstance()方法调用 
 Constructor<Employee> constructor = Employee.class.getConstructor(); Employee emp3 = constructor.newInstance(); 
  4.使用clone()方法 →不需要构造函数调用 
 Employee emp4 = (Employee) emp3.clone(); 
5.使用反序列化 →无构造函数调用
 ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj")); Employee emp5 = (Employee) in.readObject(); 
 前三个方法new关键字和newInstance()包含构造函数调用,但后来两个克隆和反序列化方法创build对象而不调用构造函数。 
以上所有方法都有不同的字节码与其相关联,请阅读以不同方式在Java中创build对象的例子以及更详细的描述,例如所有这些方法的字节码转换。
然而,可以争辩说创build一个数组或string对象也是创build对象的一种方式,但是这些事情只对某些类更具体,并且由JVM直接处理,而我们可以通过这五种方式创build任何类的对象。
从API用户的angular度来看,构造函数的另一种替代方法是静态工厂方法(如BigInteger.valueOf()),尽pipe对于API作者(在技术上“真实”),仍然使用构造函数创build对象。
方法1
使用新的关键字。 这是在java中创build对象最常用的方法。 几乎99%的对象是以这种方式创build的。
 Employee object = new Employee(); 
方法2
使用Class.forName()。 Class.forName()给你的类对象,这是reflection有用。 这个对象拥有的方法是由Java定义的,而不是由编写该类的程序员来定义的。 他们对于每个class级都是一样的。 调用newInstance()会给你一个这个类的实例(即callingClass.forName(“ExampleClass”)。newInstance(),它相当于调用新的ExampleClass()),你可以在其中调用类定义的方法,访问可见的字段等
 Employee object2 = (Employee) Class.forName(NewEmployee).newInstance(); 
Class.forName()将始终使用调用方的ClassLoader,而ClassLoader.loadClass()可以指定不同的ClassLoader。 我相信Class.forName也会初始化已加载的类,而ClassLoader.loadClass()方法不会马上执行(直到第一次使用时才会初始化)。
另一个必须阅读:
Java:线程状态介绍,简单的Java Enum示例
方法3
使用clone()。 clone()可用于创build现有对象的副本。
 Employee secondObject = new Employee(); Employee object3 = (Employee) secondObject.clone(); 
方法4
使用newInstance()方法
 Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance(); 
方法5
使用对象反序列化。 对象反序列化只不过是从序列化的forms创build一个对象。
 // Create Object5 // create a new file with an ObjectOutputStream FileOutputStream out = new FileOutputStream(""); ObjectOutputStream oout = new ObjectOutputStream(out); // write something in the file oout.writeObject(object3); oout.flush(); // create an ObjectInputStream for the file we created before ObjectInputStream ois = new ObjectInputStream(new FileInputStream("crunchify.txt")); Employee object5 = (Employee) ois.readObject(); 
具体取决于创build的意思,但其他的是:
- 克隆方法
- 反序列化
- reflection(Class.newInstance())
- reflection(构造器对象)
也有ClassLoader.loadClass(string),但是这不经常使用。
如果你想成为一名总律师,数组在技术上是对象,因为数组的.length属性。 所以初始化一个数组创build一个对象。
我们可以通过5种方式创build对象:
- 由新的运营商
- 通过class.forName()
- 由工厂方法
- 通过克隆
- 通过反思API
我们也可以用这种方式创build对象:
 String s ="Hello"; 
没有人讨论过它。