Default Constructor Java Example
In this post, we feature an example of the Default Constructor in Java.
1. Introduction
When the Java compiler compiles the Java source code (.java) into the Java byte code (.class), it will create a public no-argument constructor for the class if it has no constructor defined. This public no-argument constructor is called a default constructor. Its implementation body only has one line of code: super(); – to invoke its parent’s no-argument constructor;
In this step, I will create several classes as the following diagram.

2. Technologies Used
The example code in this article was built and run using:
- Java 11
- Maven 3.3.9
- Eclipse Oxygen
- Junit 5.5.2
3. Maven Project
In this step, I will create eight classes (three parent classes and five child classes):
P1_HasDefaultConstructor– has a public no-argument constructor.P2_NoConstructor– doesn’t have any constructor. Java compiler will create a default constructor.P3_NoDefaultConstructor– has a constructor which takes arguments.C1_P2_NoConstructor– is a sub-class extending fromP2_NoConstructorand has no constructor. Java compiler will create a default constructor.C2_P2_NoConstructor– is a sub-class extending fromP2_NoConstructorand has a constructor which takes one argument.C3_P1_HasDefaultConstructor– is a sub-class extending fromP1_HasDefaultConstructorand has no constructor. Java compiler will create a default constructor.C4_P3_NoDefaultConstructor– is a sub-class extending fromP3_NoDefaultConstructorand has a constructor which takes one argument.C5_P3_NoDefaultConstructor– is a sub-class extending fromP3_NoDefaultConstructorand has a no-argument constructor.
3.1 Dependencies
I will include Junit in the pom.xml.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>java-zheng-demo</groupId> <artifactId>default-constructor-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>11</release> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.5.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.5.2</version> <scope>test</scope> </dependency> </dependencies> </project>
3.2 P1_HasDefaultConstructor
In this step, I will create a P1_HasDefaultConstructor class which has a public no-argument constructor. This is a good practice as client can continue create instances with the no-argument constructor when a new constructor is added.
P1_HasDefaultConstructor.java
package jcg.zheng.demo.constructor;
public class P1_HasDefaultConstructor {
private String name;
public P1_HasDefaultConstructor() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.3 P2_NoConstructor
In this step, I will create a P2_NoConstructor class which has no constructor. Java compiler will create a default constructor.
P2_NoConstructor.java
package jcg.zheng.demo.constructor;
public class P2_NoConstructor {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.4 P3_NoDefaultConstructor
In this step, I will create a P3_NoDefaultConstructor class which has a constructor with an argument. Client cannot create instances with the no-argument constructor.
P3_NoDefaultConstructor.java
package jcg.zheng.demo.constructor;
public class P3_NoDefaultConstructor {
private String name;
public P3_NoDefaultConstructor(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.5 C1_P2_NoConstructor
In this step, I will create a C1_P2_NoConstructor class which extends from P2_NoConstructor and has no constructor. Java compiler will create a default constructor.
C1_P2_NoConstructor.java
package jcg.zheng.demo.constructor;
public class C1_P2_NoConstructor extends P2_NoConstructor {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
3.6 C2_P2_NoConstructor
In this step, I will create a C2_P2_NoConstructor class which extends from P2_NoConstructor and has a constructor with an argument. Client cannot initialize an object via the no-argument constructor.
C2_P2_NoConstructor.java
package jcg.zheng.demo.constructor;
public class C2_P2_NoConstructor extends P2_NoConstructor {
private String title;
public C2_P2_NoConstructor(String title) {
super();
this.title = title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
3.7 C3_P1_HasDefaultConstructor
In this step, I will create a C3_P1_HasDefaultConstructor class which has no constructor and extends from P1_HasDefaultConstructor. Java compiler will create a default constructor.
C3_P1_HasDefaultConstructor.java
package jcg.zheng.demo.constructor;
public class C3_P1_HasDefaultConstructor extends P1_HasDefaultConstructor {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
3.8 C4_P3_NoDefaultConstructor
In this step, I will create a C4_P3_NoDefaultConstructor class which has a constructor with an argument.
C4_P3_NoDefaultConstructor.java
package jcg.zheng.demo.constructor;
public class C4_P3_NoDefaultConstructor extends P3_NoDefaultConstructor {
private String title;
public C4_P3_NoDefaultConstructor(String name) {
super(name);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
3.9 C5_P3_NoDefaultConstructor
In this step, I will create a C5_P3_NoDefaultConstructor class which includes two constructors: one is a no-argument constructor.
C5_P3_NoDefaultConstructor.java
package jcg.zheng.demo.constructor;
public class C5_P3_NoDefaultConstructor extends P3_NoDefaultConstructor {
private String title;
public C5_P3_NoDefaultConstructor() {
super("DefaultName");
}
public C5_P3_NoDefaultConstructor(String name) {
super(name);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
4. JUnit Test
In this step, I will create two Junit test classes to show two ways to create an object: one using the new keyword, the other using reflection.
4.1 CreateObjectViaNewTest
In this step, a CreateObjectViaNewTest class shows how to create an object instance via the new keyword.
CreateObjectViaNewTest.java
package jcg.zheng.demo.constructor;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import jcg.zheng.demo.constructor.C1_P2_NoConstructor;
import jcg.zheng.demo.constructor.C2_P2_NoConstructor;
import jcg.zheng.demo.constructor.C3_P1_HasDefaultConstructor;
import jcg.zheng.demo.constructor.C4_P3_NoDefaultConstructor;
import jcg.zheng.demo.constructor.C5_P3_NoDefaultConstructor;
import jcg.zheng.demo.constructor.P1_HasDefaultConstructor;
import jcg.zheng.demo.constructor.P2_NoConstructor;
import jcg.zheng.demo.constructor.P3_NoDefaultConstructor;
public class CreateObjectViaNewTest {
private static final String JAVA_DEVELOPER = "Java Developer";
private static final String MARY = "Mary";
@Test
public void test_C1_P2_NoConstructor() {
C1_P2_NoConstructor pojo = new C1_P2_NoConstructor();
pojo.setName(MARY);
assertEquals(MARY, pojo.getName());
}
@Test
public void test_C2_P2_NoConstructor() {
C2_P2_NoConstructor pojo = new C2_P2_NoConstructor(MARY);
pojo.setName(MARY);
pojo.setTitle(JAVA_DEVELOPER);
assertEquals(MARY, pojo.getName());
}
@Test
public void test_C3_P1_HasDefaultConstructor() {
C3_P1_HasDefaultConstructor pojo = new C3_P1_HasDefaultConstructor();
pojo.setName(MARY);
pojo.setTitle(JAVA_DEVELOPER);
assertEquals(MARY, pojo.getName());
}
@Test
public void test_C4_P3_NoDefaultConstructor() {
C4_P3_NoDefaultConstructor pojo = new C4_P3_NoDefaultConstructor(MARY);
pojo.setTitle(JAVA_DEVELOPER);
assertEquals(MARY, pojo.getName());
}
@Test
public void test_C5_P3_NoDefaultConstructor() {
C5_P3_NoDefaultConstructor pojo = new C5_P3_NoDefaultConstructor();
pojo.setTitle(JAVA_DEVELOPER);
assertEquals("DefaultName", pojo.getName());
}
@Test
public void test_P1_HasDefaultConstructor() {
P1_HasDefaultConstructor pojo = new P1_HasDefaultConstructor();
pojo.setName(MARY);
assertEquals(MARY, pojo.getName());
}
@Test
public void test_P2_NoConstructor() {
P2_NoConstructor pojo = new P2_NoConstructor();
pojo.setName(MARY);
assertEquals(MARY, pojo.getName());
}
@Test
public void test_P3_NoDefaultConstructor() {
P3_NoDefaultConstructor pojo = new P3_NoDefaultConstructor(MARY);
assertEquals(MARY, pojo.getName());
}
}
Execute with mvn test -Dtest=CreateObjectViaNewTest and capture the output here:
Running jcg.zheng.demo.constructor.CreateObjectViaNewTest Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec Results : Tests run: 8, Failures: 0, Errors: 0, Skipped: 0
4.2 CreateObjectViaReflectionTest
In this step, a CreateObjectViaReflectionTest class shows how to create an object instance via the reflection library.
CreateObjectViareflectionTest.java
package jcg.zheng.demo.constructor;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.junit.jupiter.api.Test;
public class CreateObjectViaReflectionTest {
private Object createObjectWithNoArgsViaReflection(String className) {
try {
Class<?> c = Class.forName(className);
Constructor<?> publicConstructors = c.getConstructor();
return publicConstructors.newInstance();
} catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException | ClassNotFoundException e) {
return null;
}
}
private Object createObjectWithStringArgsViaReflection(String className, String constructorArg) {
try {
Class<?> c = Class.forName(className);
Constructor<?> publicConstructors = c.getConstructor(String.class);
return publicConstructors.newInstance(new Object[] { constructorArg });
} catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException | ClassNotFoundException e) {
return null;
}
}
@Test
public void test_C1_P2_NoConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.C1_P2_NoConstructor");
assertNotNull(object);
}
@Test
public void test_C2_P2_NoConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.C2_P2_NoConstructor");
assertNull(object);
object = createObjectWithStringArgsViaReflection("jcg.zheng.demo.constructor.C2_P2_NoConstructor", "test");
assertNotNull(object);
}
@Test
public void test_C3_P1_HasDefaultConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.C3_P1_HasDefaultConstructor");
assertNotNull(object);
}
@Test
public void test_C4_P3_NoDefaultConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.C4_P3_NoDefaultConstructor");
assertNull(object);
object = createObjectWithStringArgsViaReflection("jcg.zheng.demo.constructor.C4_P3_NoDefaultConstructor", "test");
assertNotNull(object);
}
@Test
public void test_S5_Z_NoDefaultConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.C5_P3_NoDefaultConstructor");
assertNotNull(object);
}
@Test
public void test_P1_HasDefaultConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.P1_HasDefaultConstructor");
assertNotNull(object);
}
@Test
public void test_P2_NoConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.P2_NoConstructor");
assertNotNull(object);
}
@Test
public void test_P3_NoDefaultConstructor() {
Object object = createObjectWithNoArgsViaReflection("jcg.zheng.demo.constructor.P3_NoDefaultConstructor");
assertNull(object);
object = createObjectWithStringArgsViaReflection("jcg.zheng.demo.constructor.P3_NoDefaultConstructor", "test");
assertNotNull(object);
}
}
Execute mvn test -Dtest=CreateObjectViaReflectionTest and capture the output here:
Running jcg.zheng.demo.constructor.CreateObjectViaReflectionTest Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.036 sec Results : Tests run: 8, Failures: 0, Errors: 0, Skipped: 0
5. Default Constructor in Java – Summary
In this example, I demonstrated that Java compiler creates a default constructor when the class does not define any constructor. I also demonstrated how to use Java reflection library to initialize an object. As you seen, it’s easier to create object via reflection when it has a no-argument constructor. Common frameworks, such as JPA and JAXB use Java reflection to create objects. So, it’s the best practice to define the no-argument constructor when using these frameworks.
6. Download the Source Code
You can download the full source code of this example here: Default Constructor Java Example

