[java] What are all the different ways to create an object in Java?

Had a conversation with a coworker the other day about this.

There's the obvious using a constructor, but what are the other ways there?

This question is related to java

The answer is


there is also ClassLoader.loadClass(string) but this is not often used.

and if you want to be a total lawyer about it, arrays are technically objects because of an array's .length property. so initializing an array creates an object.


Also you can use

 Object myObj = Class.forName("your.cClass").newInstance();


  • using the new operator (thus invoking a constructor)
  • using reflection clazz.newInstance() (which again invokes the constructor). Or by clazz.getConstructor(..).newInstance(..) (again using a constructor, but you can thus choose which one)

To summarize the answer - one main way - by invoking the constructor of the object's class.

Update: Another answer listed two ways that do not involve using a constructor - deseralization and cloning.


Within the Java language, the only way to create an object is by calling its constructor, be it explicitly or implicitly. Using reflection results in a call to the constructor method, deserialization uses reflection to call the constructor, factory methods wrap the call to the constructor to abstract the actual construction and cloning is similarly a wrapped constructor call.


Depends exactly what you mean by create but some other ones are:

  • Clone method
  • Deserialization
  • Reflection (Class.newInstance())
  • Reflection (Constructor object)

Method 1

Using new keyword. This is the most common way to create an object in java. Almost 99% of objects are created in this way.

Employee object = new Employee();

Method 2

Using Class.forName(). Class.forName() gives you the class object, which is useful for reflection. The methods that this object has are defined by Java, not by the programmer writing the class. They are the same for every class. Calling newInstance() on that gives you an instance of that class (i.e. callingClass.forName("ExampleClass").newInstance() it is equivalent to calling new ExampleClass()), on which you can call the methods that the class defines, access the visible fields etc.

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

Class.forName() will always use the ClassLoader of the caller, whereas ClassLoader.loadClass() can specify a different ClassLoader. I believe that Class.forName initializes the loaded class as well, whereas the ClassLoader.loadClass() approach doesn’t do that right away (it’s not initialized until it’s used for the first time).

Another must read:

Java: Thread State Introduction with Example Simple Java Enum Example

Method 3

Using clone(). The clone() can be used to create a copy of an existing object.

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

Method 4

Using newInstance() method

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

Method 5

Using Object Deserialization. Object Deserialization is nothing but creating an object from its serialized form.

// 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();

We can create an objects in 5 ways:

  1. by new operator
  2. by reflection (e.g. Class.forName() followed by Class.newInstance())
  3. by factory method
  4. by cloning
  5. by reflection api

From an API user perspective, another alternative to constructors are static factory methods (like BigInteger.valueOf()), though for the API author (and technically "for real") the objects are still created using a constructor.


Reflection:

someClass.newInstance();

There is a type of object, which can't be constructed by normal instance creation mechanisms (calling constructors): Arrays. Arrays are created with

 A[] array = new A[len];

or

 A[] array = new A[] { value0, value1, value2 };

As Sean said in a comment, this is syntactically similar to a constructor call and internally it is not much more than allocation and zero-initializing (or initializing with explicit content, in the second case) a memory block, with some header to indicate the type and the length.

When passing arguments to a varargs-method, an array is there created (and filled) implicitly, too.

A fourth way would be

 A[] array = (A[]) Array.newInstance(A.class, len);

Of course, cloning and deserializing works here, too.

There are many methods in the Standard API which create arrays, but they all in fact are using one (or more) of these ways.


This should be noticed if you are new to java, every object has inherited from Object

protected native Object clone() throws CloneNotSupportedException;


there is also ClassLoader.loadClass(string) but this is not often used.

and if you want to be a total lawyer about it, arrays are technically objects because of an array's .length property. so initializing an array creates an object.


Reflection:

someClass.newInstance();

There are five different ways to create an object in Java,

1. Using new keyword ? constructor get called

Employee emp1 = new Employee();

2. Using newInstance() method of Class ? constructor get called

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

It can also be written as

Employee emp2 = Employee.class.newInstance();

3. Using newInstance() method of Constructor ? constructor get called

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

4. Using clone() method ? no constructor call

Employee emp4 = (Employee) emp3.clone();

5. Using deserialization ? no constructor call

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

First three methods new keyword and both newInstance() include a constructor call but later two clone and deserialization methods create objects without calling the constructor.

All above methods have different bytecode associated with them, Read Different ways to create objects in Java with Example for examples and more detailed description e.g. bytecode conversion of all these methods.

However one can argue that creating an array or string object is also a way of creating the object but these things are more specific to some classes only and handled directly by JVM, while we can create an object of any class by using these 5 ways.


Within the Java language, the only way to create an object is by calling its constructor, be it explicitly or implicitly. Using reflection results in a call to the constructor method, deserialization uses reflection to call the constructor, factory methods wrap the call to the constructor to abstract the actual construction and cloning is similarly a wrapped constructor call.


You can also clone existing object (if it implements Cloneable).

Foo fooClone = fooOriginal.clone (); 

there is also ClassLoader.loadClass(string) but this is not often used.

and if you want to be a total lawyer about it, arrays are technically objects because of an array's .length property. so initializing an array creates an object.


Method 1

Using new keyword. This is the most common way to create an object in java. Almost 99% of objects are created in this way.

Employee object = new Employee();

Method 2

Using Class.forName(). Class.forName() gives you the class object, which is useful for reflection. The methods that this object has are defined by Java, not by the programmer writing the class. They are the same for every class. Calling newInstance() on that gives you an instance of that class (i.e. callingClass.forName("ExampleClass").newInstance() it is equivalent to calling new ExampleClass()), on which you can call the methods that the class defines, access the visible fields etc.

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

Class.forName() will always use the ClassLoader of the caller, whereas ClassLoader.loadClass() can specify a different ClassLoader. I believe that Class.forName initializes the loaded class as well, whereas the ClassLoader.loadClass() approach doesn’t do that right away (it’s not initialized until it’s used for the first time).

Another must read:

Java: Thread State Introduction with Example Simple Java Enum Example

Method 3

Using clone(). The clone() can be used to create a copy of an existing object.

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

Method 4

Using newInstance() method

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

Method 5

Using Object Deserialization. Object Deserialization is nothing but creating an object from its serialized form.

// 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();

We can also create the object in this way:-

String s ="Hello";

Nobody has discuss it.


There are FIVE different ways to create objects in Java:

1. Using `new` keyword:

This is the most common way to create an object in Java. Almost 99% of objects are created in this way.

MyObject object = new MyObject();//normal way

2. By Using Factory Method:

ClassName ObgRef=ClassName.FactoryMethod();

Example:

RunTime rt=Runtime.getRunTime();//Static Factory Method

3. By Using Cloning Concept:

By using clone(), the clone() can be used to create a copy of an existing object.

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

4. Using `Class.forName()`:

If we know the name of the class & if it has a public default constructor we can create an object in this way.

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

Example:

String st=(String)Class.forName("java.lang.String").newInstance();

5. Using object deserialization:

Object deserialization is nothing but creating an object from its serialized form.

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();

Depends exactly what you mean by create but some other ones are:

  • Clone method
  • Deserialization
  • Reflection (Class.newInstance())
  • Reflection (Constructor object)

From an API user perspective, another alternative to constructors are static factory methods (like BigInteger.valueOf()), though for the API author (and technically "for real") the objects are still created using a constructor.


We can create an objects in 5 ways:

  1. by new operator
  2. by reflection (e.g. Class.forName() followed by Class.newInstance())
  3. by factory method
  4. by cloning
  5. by reflection api

Yes, you can create objects using reflection. For example, String.class.newInstance() will give you a new empty String object.


Reflection will also do the job for you.

SomeClass anObj = SomeClass.class.newInstance();

is another way to create a new instance of a class. In this case, you will also need to handle the exceptions that might get thrown.


There are various ways:

  • Through Class.newInstance.
  • Through Constructor.newInstance.
  • Through deserialisation (uses the no-args constructor of the most derived non-serialisable base class).
  • Through Object.clone (does not call a constructor).
  • Through JNI (should call a constructor).
  • Through any other method that calls a new for you.
  • I guess you could describe class loading as creating new objects (such as interned Strings).
  • A literal array as part of the initialisation in a declaration (no constructor for arrays).
  • The array in a "varargs" (...) method call (no constructor for arrays).
  • Non-compile time constant string concatenation (happens to produce at least four objects, on a typical implementation).
  • Causing an exception to be created and thrown by the runtime. For instance throw null; or "".toCharArray()[0].
  • Oh, and boxing of primitives (unless cached), of course.
  • JDK8 should have lambdas (essentially concise anonymous inner classes), which are implicitly converted to objects.
  • For completeness (and Paulo Ebermann), there's some syntax with the new keyword as well.

From an API user perspective, another alternative to constructors are static factory methods (like BigInteger.valueOf()), though for the API author (and technically "for real") the objects are still created using a constructor.


Also, you can de-serialize data into an object. This doesn't go through the class Constructor !


UPDATED : Thanks Tom for pointing that out in your comment ! And Michael also experimented.

It goes through the constructor of the most derived non-serializable superclass.
And when that class has no no-args constructor, a InvalidClassException is thrown upon de-serialization.

Please see Tom's answer for a complete treatment of all cases ;-)
is there any other way of creating an object without using "new" keyword in java


Also you can use

 Object myObj = Class.forName("your.cClass").newInstance();


From an API user perspective, another alternative to constructors are static factory methods (like BigInteger.valueOf()), though for the API author (and technically "for real") the objects are still created using a constructor.


Yes, you can create objects using reflection. For example, String.class.newInstance() will give you a new empty String object.


There is a type of object, which can't be constructed by normal instance creation mechanisms (calling constructors): Arrays. Arrays are created with

 A[] array = new A[len];

or

 A[] array = new A[] { value0, value1, value2 };

As Sean said in a comment, this is syntactically similar to a constructor call and internally it is not much more than allocation and zero-initializing (or initializing with explicit content, in the second case) a memory block, with some header to indicate the type and the length.

When passing arguments to a varargs-method, an array is there created (and filled) implicitly, too.

A fourth way would be

 A[] array = (A[]) Array.newInstance(A.class, len);

Of course, cloning and deserializing works here, too.

There are many methods in the Standard API which create arrays, but they all in fact are using one (or more) of these ways.


Other ways if we are being exhaustive.

  • On the Oracle JVM is Unsafe.allocateInstance() which creates an instance without calling a constructor.
  • Using byte code manipulation you can add code to anewarray, multianewarray, newarray or new. These can be added using libraries such as ASM or BCEL. A version of bcel is shipped with Oracle's Java. Again this doesn't call a constructor, but you can call a constructor as a seperate call.

There are various ways:

  • Through Class.newInstance.
  • Through Constructor.newInstance.
  • Through deserialisation (uses the no-args constructor of the most derived non-serialisable base class).
  • Through Object.clone (does not call a constructor).
  • Through JNI (should call a constructor).
  • Through any other method that calls a new for you.
  • I guess you could describe class loading as creating new objects (such as interned Strings).
  • A literal array as part of the initialisation in a declaration (no constructor for arrays).
  • The array in a "varargs" (...) method call (no constructor for arrays).
  • Non-compile time constant string concatenation (happens to produce at least four objects, on a typical implementation).
  • Causing an exception to be created and thrown by the runtime. For instance throw null; or "".toCharArray()[0].
  • Oh, and boxing of primitives (unless cached), of course.
  • JDK8 should have lambdas (essentially concise anonymous inner classes), which are implicitly converted to objects.
  • For completeness (and Paulo Ebermann), there's some syntax with the new keyword as well.

There are five different ways to create an object in Java,

1. Using new keyword ? constructor get called

Employee emp1 = new Employee();

2. Using newInstance() method of Class ? constructor get called

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

It can also be written as

Employee emp2 = Employee.class.newInstance();

3. Using newInstance() method of Constructor ? constructor get called

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

4. Using clone() method ? no constructor call

Employee emp4 = (Employee) emp3.clone();

5. Using deserialization ? no constructor call

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

First three methods new keyword and both newInstance() include a constructor call but later two clone and deserialization methods create objects without calling the constructor.

All above methods have different bytecode associated with them, Read Different ways to create objects in Java with Example for examples and more detailed description e.g. bytecode conversion of all these methods.

However one can argue that creating an array or string object is also a way of creating the object but these things are more specific to some classes only and handled directly by JVM, while we can create an object of any class by using these 5 ways.


Reflection:

someClass.newInstance();

there is also ClassLoader.loadClass(string) but this is not often used.

and if you want to be a total lawyer about it, arrays are technically objects because of an array's .length property. so initializing an array creates an object.



This should be noticed if you are new to java, every object has inherited from Object

protected native Object clone() throws CloneNotSupportedException;


Reflection will also do the job for you.

SomeClass anObj = SomeClass.class.newInstance();

is another way to create a new instance of a class. In this case, you will also need to handle the exceptions that might get thrown.


Also, you can de-serialize data into an object. This doesn't go through the class Constructor !


UPDATED : Thanks Tom for pointing that out in your comment ! And Michael also experimented.

It goes through the constructor of the most derived non-serializable superclass.
And when that class has no no-args constructor, a InvalidClassException is thrown upon de-serialization.

Please see Tom's answer for a complete treatment of all cases ;-)
is there any other way of creating an object without using "new" keyword in java


Within the Java language, the only way to create an object is by calling its constructor, be it explicitly or implicitly. Using reflection results in a call to the constructor method, deserialization uses reflection to call the constructor, factory methods wrap the call to the constructor to abstract the actual construction and cloning is similarly a wrapped constructor call.


Reflection:

someClass.newInstance();

Other ways if we are being exhaustive.

  • On the Oracle JVM is Unsafe.allocateInstance() which creates an instance without calling a constructor.
  • Using byte code manipulation you can add code to anewarray, multianewarray, newarray or new. These can be added using libraries such as ASM or BCEL. A version of bcel is shipped with Oracle's Java. Again this doesn't call a constructor, but you can call a constructor as a seperate call.


Depends exactly what you mean by create but some other ones are:

  • Clone method
  • Deserialization
  • Reflection (Class.newInstance())
  • Reflection (Constructor object)

We can also create the object in this way:-

String s ="Hello";

Nobody has discuss it.


  • using the new operator (thus invoking a constructor)
  • using reflection clazz.newInstance() (which again invokes the constructor). Or by clazz.getConstructor(..).newInstance(..) (again using a constructor, but you can thus choose which one)

To summarize the answer - one main way - by invoking the constructor of the object's class.

Update: Another answer listed two ways that do not involve using a constructor - deseralization and cloning.


There are FIVE different ways to create objects in Java:

1. Using `new` keyword:

This is the most common way to create an object in Java. Almost 99% of objects are created in this way.

MyObject object = new MyObject();//normal way

2. By Using Factory Method:

ClassName ObgRef=ClassName.FactoryMethod();

Example:

RunTime rt=Runtime.getRunTime();//Static Factory Method

3. By Using Cloning Concept:

By using clone(), the clone() can be used to create a copy of an existing object.

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

4. Using `Class.forName()`:

If we know the name of the class & if it has a public default constructor we can create an object in this way.

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

Example:

String st=(String)Class.forName("java.lang.String").newInstance();

5. Using object deserialization:

Object deserialization is nothing but creating an object from its serialized form.

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();