- 3.1 Introduction
- 3.2 Instance Variables, set Methods and get Methods
- 3.3 Primitive Types vs. Reference Types
- 3.4 Account Class: Initializing Objects with Constructors
- 3.5 Account Class with a Balance; Floating-Point Numbers
- 3.6 Wrap-Up
3.4 Account Class: Initializing Objects with Constructors
As mentioned in Section 3.2, when an object of class Account (Fig. 3.1) is created, its String instance variable name is initialized to null by default. But what if you want to provide a name when you create an Account object?
Each class you declare can optionally provide a constructor with parameters that can be used to initialize an object of a class when the object is created. Java requires a constructor call for every object that’s created, so this is the ideal point to initialize an object’s instance variables. The next example enhances class Account (Fig. 3.5) with a constructor that can receive a name and use it to initialize instance variable name when an Account object is created (Fig. 3.6).
Fig. 3.5 | Account class with a constructor that initializes the name.
1 // Fig. 3.5: Account.java
2 // Account class with a constructor that initializes the name.
3
4 public class Account
5 {
6 private String name; // instance variable
7
8 // constructor initializes name with parameter name
9 public Account(String name) // constructor name is class name
10 {
11 this.name = name;
12 }
13
14 // method to set the name
15 public void setName(String name)
16 {
17 this.name = name;
18 }
19
20 // method to retrieve the name
21 public String getName()
22 {
23 return name;
24 }
25 } // end class Account
Fig. 3.6 | Using the Account constructor to initialize the name instance variable at the time each Account object is created.
1 // Fig. 3.6: AccountTest.java
2 // Using the Account constructor to initialize the name instance
3 // variable at the time each Account object is created.
4
5 public class AccountTest
6 {
7 public static void main(String[] args)
8 {
9 // create two Account objects
10 Account account1 = new Account(,"Jane Green");
11 Account account2 = new Account("John Blue");
12
13 // display initial value of name for each Account
14 System.out.printf("account1 name is: %s%n", account1.getName());
15 System.out.printf("account2 name is: %s%n", account2.getName());
16 }
17 } // end class AccountTest
account1 name is: Jane Green account2 name is: John Blue
3.4.1 Declaring an Account Constructor for Custom Object Initialization
When you declare a class, you can provide your own constructor to specify custom initialization for objects of your class. For example, you might want to specify a name for an Account object when the object is created, as in line 10 of Fig. 3.6:
Account account1 = new Account("Jane Green");
In this case, the String argument "Jane Green" is passed to the Account object’s constructor and used to initialize the name instance variable. The preceding statement requires that the class provide a constructor that takes only a String parameter. Figure 3.5 contains a modified Account class with such a constructor.
Account Constructor Declaration
Lines 9–12 of Fig. 3.5 declare Account’s constructor. A constructor must have the same name as the class. A constructor’s parameter list specifies that the constructor requires one or more pieces of data to perform its task. Line 9 indicates that the constructor has a String parameter called name. When you create a new Account object (as you’ll see in Fig. 3.6), you’ll pass a person’s name to the constructor, which will receive that name in the parameter name. The constructor will then assign name to instance variable name in line 11.
Parameter name of Class Account’s Constructor and Method setName
Recall from Section 3.2.1 that method parameters are local variables. In Fig. 3.5, the constructor and method setName both have a parameter called name. Although these parameters have the same identifier (name), the parameter in line 9 is a local variable of the constructor that’s not visible to method setName, and the one in line 15 is a local variable of setName that’s not visible to the constructor.
3.4.2 Class AccountTest: Initializing Account Objects When They’re Created
The AccountTest program (Fig. 3.6) initializes two Account objects using the constructor. Line 10 creates and initializes the Account object account1. Keyword new requests memory from the system to store the Account object, then implicitly calls the class’s constructor to initialize the object. The call is indicated by the parentheses after the class name, which contain the argument "Jane Green" that’s used to initialize the new object’s name. The class instance creation expression in line 10 returns a reference to the new object, which is assigned to the variable account1. Line 11 repeats this process, passing the argument "John Blue" to initialize the name for account2. Lines 14–15 use each object’s getName method to obtain the names and show that they were indeed initialized when the objects were created. The output shows different names, confirming that each Account maintains its own copy of instance variable name.
Constructors Cannot Return Values
An important difference between constructors and methods is that constructors cannot return values, so they cannot specify a return type (not even void). Normally, constructors are declared public—later in the book we’ll explain when to use private constructors.
Default Constructor
Recall that line 13 of Fig. 3.2
Account myAccount = new Account();
used new to create an Account object. The empty parentheses after “new Account” indicate a call to the class’s default constructor—in any class that does not explicitly declare a constructor, the compiler provides a default constructor (which always has no parameters). When a class has only the default constructor, the class’s instance variables are initialized to their default values. In Section 8.5, you’ll learn that classes can have multiple constructors.
There’s No Default Constructor in a Class That Declares a Constructor
If you declare a constructor for a class, the compiler will not create a default constructor for that class. In that case, you will not be able to create an Account object with the class instance creation expression new Account() as we did in Fig. 3.2—unless the custom constructor you declare takes no parameters.
Adding the Constructor to Class Account’s UML Class Diagram
The UML class diagram of Fig. 3.7 models class Account of Fig. 3.5, which has a constructor with a String name parameter. Like operations, the UML models constructors in the third compartment of a class diagram. To distinguish a constructor from the class’s operations, the UML requires that the word “constructor” be enclosed in guillemets (« and ») and placed before the constructor’s name. It’s customary to list constructors before other operations in the third compartment.
Fig. 3.7 | UML class diagram for Account class of Fig. 3.5.