Home | | Object Oriented Programming | | The Complete Reference Java | | Internet Programming | | Web Programming | Invoking Overloaded Constructors Through this( )

Chapter: Java The Complete Reference - The Java Language - I/O, Applets, and Other Topics

| Study Material, Lecturing Notes, Assignment, Reference, Wiki description explanation, brief detail |

Invoking Overloaded Constructors Through this( )

When working with overloaded constructors, it is sometimes useful for one constructor to invoke another. In Java, this is accomplished by using another form of the this keyword.

Invoking Overloaded Constructors Through this( )

 

When working with overloaded constructors, it is sometimes useful for one constructor to invoke another. In Java, this is accomplished by using another form of the this keyword. The general form is shown here:

 

this(arg-list)

 

When this( ) is executed, the overloaded constructor that matches the parameter list specified by arg-list is executed first. Then, if there are any statements inside the original constructor, they are executed. The call to this( ) must be the first statement within

 

the constructor.

 

To understand how this( ) can be used, let’s work through a short example. First, consider the following class that does not use this( ):

 

class MyClass { int a;

 

int b;

 

     //initialize a and b individually

     MyClass(int i, int j) {

 

a = i; b = j;

 

}

 

     //initialize a and b to the same value

     MyClass(int i) {

 

a = i; b = i;

 

}

//give a and b default values of 0

     MyClass( ) {

 

a = 0; b = 0;

 

}

 

}

This class contains three constructors, each of which initializes the values of a and b. The first is passed individual values for a and b. The second is passed just one value, which is assigned to both a and b. The third gives a and b default values of zero.

By using this( ), it is possible to rewrite MyClass as shown here:

 

class MyClass { int a;

 

int b;

 

     //initialize a and b individually

     MyClass(int i, int j) {

 

a = i; b = j;

 

}

 

     //initialize a and b to the same value

     MyClass(int i) {

 

this(i, i); // invokes

MyClass(i, i)

 

}

 

     //give a and b default values of 0

     MyClass( ) {

 

this(0); // invokes MyClass(0)

 

}

 

}

 

In this version of MyClass, the only constructor that actually assigns values to the a and b fields is MyClass(int, int). The other two constructors simply invoke that constructor (either directly or indirectly) through this( ). For example, consider what happens when this statement executes:

 

MyClass mc = new MyClass(8);

 

The call to MyClass(8) causes this(8, 8) to be executed, which translates into a call to MyClass(8, 8), because this is the version of the MyClass constructor whose parameter list matches the arguments passed via this( ). Now, consider the following statement, which uses the default constructor:

 

MyClass mc2 = new MyClass();

 

In this case, this(0) is called. This causes MyClass(0) to be invoked because it is the constructor with the matching parameter list. Of course, MyClass(0) then calls MyClass(0,0) as just described.

 

One reason why invoking overloaded constructors through this( ) can be useful is that it can prevent the unnecessary duplication of code. In many cases, reducing duplicate code decreases the time it takes to load your class because often the object code is smaller. This is especially important for programs delivered via the Internet in which load times are an issue. Using this( ) can also help structure your code when constructors contain a large amount of duplicate code.

 

However, you need to be careful. Constructors that call this( ) will execute a bit slower than those that contain all of their initialization code inline. This is because the call and return mechanism used when the second constructor is invoked adds overhead. If your class will be used to create only a handful of objects, or if the constructors in the class that call this( ) will be seldom used, then this decrease in run-time performance is probably insignificant. However, if your class will be used to create a large number of objects (on the order of thousands) during program execution, then the negative impact of the increased overhead could be meaningful. Because object creation affects all users of your class, there will be cases in which you must carefully weigh the benefits of faster load time against the increased time it takes to create an object.

 

Here is another consideration: for very short constructors, such as those used by MyClass, there is often little difference in the size of the object code whether this( ) is used or not. (Actually, there are cases in which no reduction in the size of the object code is achieved.) This is because the bytecode that sets up and returns from the call to this( ) adds instructions to the object file. Therefore, in these types of situations, even though duplicate code is eliminated, using this( ) will not obtain significant savings in terms of load time. However, the added cost in terms of overhead to each object’s construction will still be incurred. Therefore, this( ) is most applicable to constructors that contain large amounts of initialization code, not those that simply set the value of a handful of fields.

There are two restrictions you need to keep in mind when using this( ). First, you cannot use any instance variable of the constructor’s class in a call to this( ). Second, you cannot use super( ) and this( ) in the same constructor because each must be the first statement in the constructor.


Study Material, Lecturing Notes, Assignment, Reference, Wiki description explanation, brief detail


Copyright © 2018-2020 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.