184

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?

Hearen
  • 7,420
  • 4
  • 53
  • 63
Mike Deck
  • 18,045
  • 16
  • 68
  • 92
  • 9
    there are 3 only: normal c-tor (new keyword), clone() and `Unsafe.allocateInstance(Class)`. The rest call one of those. Reflection is compiled to c-tor call, deserialization to Unsafe.allocateInstance(Class). You can create your own API and you will end up calling one of those. – bestsss Feb 25 '11 at 18:06
  • 2
    @bestsss- `Unsafe` is an implementation-specific detail of Java and isn't mentioned anywhere in the spec. It is entirely possible to build a compliant Java implementation that does not use compile reflection down to code that uses `new`, `clone`, or `Unsafe.allocateInstance`. – templatetypedef Jul 14 '11 at 00:49
  • 2
    When in doubt, look at the language spec. 12.5 Creation of New Class Instances http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.5 15.9 Class Instance Creation Expressions http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#41147 – Internet Friend Sep 18 '08 at 18:42
  • 2
    you could check the link, http://www.codesandlogics.com/2017/01/ways-to-create-objects-in-java.html – Pragya Jan 08 '17 at 07:26
  • http://www.javabench.in/2015/04/how-many-ways-we-can-create-object-in.html – Raúl Feb 03 '17 at 14:30
  • check https://youtu.be/gGGCmrD6Qpw to see complete code example – nanosoft Aug 29 '17 at 18:31

22 Answers22

291

There are four different ways to create objects in java:

A. 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();

B. 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.

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

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

MyObject anotherObject = new MyObject();
MyObject object = (MyObject) anotherObject.clone();

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

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

You can read them from here.

Hearen
  • 7,420
  • 4
  • 53
  • 63
kamaci
  • 72,915
  • 69
  • 228
  • 366
69

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 Paŭlo Ebermann), there's some syntax with the new keyword as well.
Tom Hawtin - tackline
  • 145,806
  • 30
  • 211
  • 305
25

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.

Confusion
  • 16,256
  • 8
  • 46
  • 71
  • 1
    Incorrect. Deserializatio does not call a class's constructor either explicitly or implicitly. – user207421 Jul 09 '15 at 10:14
  • 2
    I should not have written 'its constructor' and 'the constructor', but rather 'an constructor' and 'a constructor'. In the case of deserialization, the first applicable no-arg constructor is always called. – Confusion Jul 15 '15 at 07:23
  • 1
    The default clone implementation does not call any constructor. – Didier L Nov 16 '16 at 16:51
  • if this is my clone method implementation "return super.clone();". Then it will not invoke constructor. – Mateen May 26 '18 at 03:58
13

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

Thomas Lötzer
  • 24,832
  • 16
  • 69
  • 55
11

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.

Community
  • 1
  • 1
Naresh Joshi
  • 4,188
  • 35
  • 45
  • Please disclose any [affiliations](https://stackoverflow.com/help/promotion) and do not use the site as a way to promote your site through posting. See [How do I write a good answer?](https://stackoverflow.com/help/how-to-answer). –  Dec 15 '18 at 04:52
9

Cloning and deserialization.

Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
6

Also you can use

 Object myObj = Class.forName("your.cClass").newInstance();
Vincent Ramdhanie
  • 102,349
  • 23
  • 137
  • 192
6

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

protected native Object clone() throws CloneNotSupportedException;

stacker
  • 68,052
  • 28
  • 140
  • 210
  • @stacker: Could you please explain how is this related to creating a new object? Thanks. – ryanprayogo Jan 20 '10 at 17:01
  • 4
    @ryanprayogo clone() will return a new object (even though the object is a clone of the object that clone() was called on) and is actually the only way to create a new object without the constructor being called. – Thomas Lötzer Jan 20 '10 at 17:04
6

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

Community
  • 1
  • 1
KLE
  • 23,689
  • 4
  • 56
  • 62
  • 1
    It does go through a constructor (the no-arg constructor of the most derived non-serialisable superclass). – Tom Hawtin - tackline Jan 20 '10 at 17:42
  • 1
    @Tom Oh wow - I did not know that and experimented a bit. Apparently when the most derived non-serializable superclass *does not have* a no-args constructor, it results in an InvalidClassException *being serialized into the stream and thrown upon deserialization!!* - How bizarre is that? – Michael Borgwardt Jan 20 '10 at 22:23
6

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.

Paŭlo Ebermann
  • 73,284
  • 20
  • 146
  • 210
5

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.
Peter Lawrey
  • 525,659
  • 79
  • 751
  • 1,130
4

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.

ryanprayogo
  • 11,587
  • 11
  • 51
  • 66
4
  • 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.

Bozho
  • 588,226
  • 146
  • 1,060
  • 1,140
4

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();
ServAce85
  • 1,602
  • 2
  • 23
  • 51
  • (4) only requires `Class.forName()` if you don't already have the class, which in all the other cases you do. It also doesn't require a no-args constructor: there are ways to call any public constructor if you know the correct arguments. And you've left out at least two other ways. – user207421 May 22 '12 at 08:15
  • 2
    (2) Factory Method is just a pattern for getting objects. But internally it uses "new" keyword for creating objects. – Karthik Bose Dec 17 '13 at 07:59
  • man why are so many people saying factory method create objects, where did you guys learn this from ? – Mateen May 26 '18 at 04:02
4

Reflection:

someClass.newInstance();
John Meagher
  • 22,808
  • 14
  • 54
  • 57
3

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

Foo fooClone = fooOriginal.clone (); 
Roman
  • 64,384
  • 92
  • 238
  • 332
2

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();
user207421
  • 305,947
  • 44
  • 307
  • 483
Andriya
  • 241
  • 2
  • 14
  • Don't use code formatting for text that isn't code. There are more methods than these. Read the other answers. 'Almost 99%' is just guesswork. – user207421 Jul 09 '15 at 09:50
  • Hi EJP sorry for this mistake...I said this is one kind of way to create the objects not said exactly its the right one.Its just a model..and sorry am alearner and new one to stackoverflow – Andriya Jul 09 '15 at 10:05
0

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.

Fabian Steeg
  • 44,988
  • 7
  • 85
  • 112
-1

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

  • Clone method
  • Deserialization
  • Reflection (Class.newInstance())
  • Reflection (Constructor object)
Garth Gilmour
  • 11,124
  • 5
  • 25
  • 35
-2

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.

Randy L
  • 14,384
  • 14
  • 44
  • 73
  • 1
    loadClass(String name) returns resulting Class object which an object yes But not that class's object. If examples are given then its we can find numerous such examples throughout java library but those will be class specific. check https://youtu.be/gGGCmrD6Qpw – nanosoft Aug 29 '17 at 18:30
-3

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
Garth Gilmour
  • 11,124
  • 5
  • 25
  • 35
  • 3
    Class.forName() loads a class rather than creating an object. – user207421 May 22 '12 at 08:15
  • reflexion? Surely you mean reflection. – Stephen C Jun 26 '15 at 11:36
  • how would you create object from factory method, internal implementation may be again using new key word right? and why do you have reflection twice ? It would make more sense if you actually give some exampls – Mateen May 26 '18 at 03:53
-5

We can also create the object in this way:-

String s ="Hello";

Nobody has discuss it.

Deepak Sharma
  • 4,999
  • 5
  • 51
  • 61
  • This is the way of creating primitive data types, it is just a flexibility that Java provides behind the scenes to not use the "new" keyword.This is the same as the new keyword. – Madusudanan Jun 24 '14 at 07:04
  • Madhusudan, FYI , With the help of new operator, objects should always store in heap while in this case "Hello" is an object which should store in String pool. And String is a class not a primitive datatype . – Deepak Sharma Jun 24 '14 at 13:32
  • This doesn't create an object. It assigns a reference to an existing object. The object had already been created by the compiler and classloader. – user207421 Jul 09 '15 at 09:59