Multiple Constructors

You may have noticed that you have not added constructors to all your classes. If you omit constructors from your class, Java automatically generates a no arguments constructor for you: this is called the default constructor. The default constructor does not do anything, but it is the reason why you can instantiate a class with no constructors, for instance:

A a = new A();

As soon as you add your own constructor to a class, or extend a class that has a constructor defined, the default constructor disappears and can no longer be invoked. Java assumes that because you have added a constructor you want all code to use this constructor.

It is, however, possible to add a no arguments constructor alongside another constructor: the following class has two constructors:

package constructors;

public class Person {

    private String firstName;

    private String lastName;

     

    public Person() {}

     

    public Person(String firstName, String lastName) {

        this.firstName = firstName;

        this.lastName = lastName;

    }

}

In fact, a class can have as many constructors as you need, as long as each constructor is unique in terms of the number and/or type of parameters.

I will now create a slightly more complex example. I want to add a yearRegistered field to the Person class. This needs to be populated with the current year when a Person is instantiated, and can never be changed after that point.

In order to create a field that can never be changed I can mark it as final. As mentioned earlier in the book, a final field can only be initialized on the line that declares it, or inside a constructor.

Inside this program I want to initialize the field from a Calendar so that it is always assigned the current year. This introduces a problem, however, because I don’t want to add the same code to both constructors. I can overcome this problem as follows:

package constructors;

import java.util.Calendar;

import java.util.GregorianCalendar;

 

public class Person {

    private String firstName;

    private String lastName;

    private final int yearRegistered;

     

    public Person() {

        Calendar c = new GregorianCalendar();

        yearRegistered = c.get(Calendar.YEAR);

    }

     

    public Person(String firstName, String lastName) {

        this();

        this.firstName = firstName;

        this.lastName = lastName;        

    }

}

 
//

This example takes advantage of the GregorianCalendar class. This will be examined in detail later in the book, along with a better way of encapsulating years.

I have placed the code for initializing yearRegistered in the no-arguments constructor. I then invoke the no-arguments constructor from the second constructor by calling this(). The call to this() must be the first line in the constructor, and ensures that the code in the no-arguments constructor is executed regardless of which constructor is invoked.

This is a very common pattern with constructors, and can include several levels of invocation. For instance, a three arguments constructor may invoke a two arguments constructor, which in turn invokes a no arguments constructor. The only thing you need to guard against is creating a loop – for instance if the no-arguments constructor invoked the three arguments constructor.

If you ever find yourself writing the same code in multiple constructors, think back to this example and try to structure your code to remove the duplication.

A Software Engineer Learns Java and Object Orientated Programming
titlepage.xhtml
part0000_split_000.html
part0000_split_001.html
part0000_split_002.html
part0000_split_003.html
part0000_split_004.html
part0000_split_005.html
part0000_split_006.html
part0000_split_007.html
part0000_split_008.html
part0000_split_009.html
part0000_split_010.html
part0000_split_011.html
part0000_split_012.html
part0000_split_013.html
part0000_split_014.html
part0000_split_015.html
part0000_split_016.html
part0000_split_017.html
part0000_split_018.html
part0000_split_019.html
part0000_split_020.html
part0000_split_021.html
part0000_split_022.html
part0000_split_023.html
part0000_split_024.html
part0000_split_025.html
part0000_split_026.html
part0000_split_027.html
part0000_split_028.html
part0000_split_029.html
part0000_split_030.html
part0000_split_031.html
part0000_split_032.html
part0000_split_033.html
part0000_split_034.html
part0000_split_035.html
part0000_split_036.html
part0000_split_037.html
part0000_split_038.html
part0000_split_039.html
part0000_split_040.html
part0000_split_041.html
part0000_split_042.html
part0000_split_043.html
part0000_split_044.html
part0000_split_045.html
part0000_split_046.html
part0000_split_047.html
part0000_split_048.html
part0000_split_049.html
part0000_split_050.html
part0000_split_051.html
part0000_split_052.html
part0000_split_053.html
part0000_split_054.html
part0000_split_055.html
part0000_split_056.html
part0000_split_057.html
part0000_split_058.html
part0000_split_059.html
part0000_split_060.html
part0000_split_061.html
part0000_split_062.html
part0000_split_063.html
part0000_split_064.html
part0000_split_065.html
part0000_split_066.html
part0000_split_067.html
part0000_split_068.html
part0000_split_069.html
part0000_split_070.html
part0000_split_071.html
part0000_split_072.html
part0000_split_073.html
part0000_split_074.html
part0000_split_075.html
part0000_split_076.html
part0000_split_077.html
part0000_split_078.html
part0000_split_079.html
part0000_split_080.html
part0000_split_081.html
part0000_split_082.html
part0000_split_083.html
part0000_split_084.html
part0000_split_085.html
part0000_split_086.html
part0000_split_087.html
part0000_split_088.html
part0000_split_089.html
part0000_split_090.html
part0000_split_091.html
part0000_split_092.html
part0000_split_093.html
part0000_split_094.html
part0000_split_095.html
part0000_split_096.html
part0000_split_097.html
part0000_split_098.html
part0000_split_099.html
part0000_split_100.html
part0000_split_101.html
part0000_split_102.html
part0000_split_103.html
part0000_split_104.html
part0000_split_105.html
part0000_split_106.html
part0000_split_107.html
part0000_split_108.html
part0000_split_109.html
part0000_split_110.html
part0000_split_111.html
part0000_split_112.html
part0000_split_113.html
part0000_split_114.html
part0000_split_115.html
part0000_split_116.html
part0000_split_117.html
part0000_split_118.html
part0000_split_119.html
part0000_split_120.html
part0000_split_121.html
part0000_split_122.html
part0000_split_123.html
part0000_split_124.html
part0000_split_125.html
part0000_split_126.html
part0000_split_127.html
part0000_split_128.html
part0000_split_129.html
part0000_split_130.html
part0000_split_131.html
part0000_split_132.html
part0000_split_133.html
part0000_split_134.html
part0000_split_135.html
part0000_split_136.html
part0000_split_137.html
part0000_split_138.html
part0000_split_139.html