Implementing Classes
Desired Learning Outcome
• To become familiar with the process of implementing classes
• To be able to implement and test simple methods
• To understand the purpose and use of constructors
• To understand how to access instance variables and local variables
• To be able to write javadoc comments
Objects
In Java, you build programs for objects.
Each object has certain behaviors and states.
• Dogs have state (name, color, breed, hungry) and behavior (barking,
fetching, wagging tail).
• Cars also have state (current gear, current speed) and behavior
(changing gear, accelerating, applying brakes).
Interacting with Objects
Object: an entity in your program that you can manipulate by calling
one or more of its methods.
Method: consists of a sequence of instructions that can access the
data of an object.
You do not know what the instructions are
You do know that the behavior is well
defined
E.g., applying brakes on a car
C las s es
A class describes a set of objects with the same behavior
A class is like a blueprint for making objects.
• There may be thousands of other cars of the same make
and model.
• Each car was built from the same set of blueprints and
therefore contains the same components.
• In object-oriented terms, we say that a car is
an instance of the class of objects known as cars.
• A class is the blueprint from which individual objects are
created.
Instance Variables and Encapsulation
Figure 1 Tally counter
Instance of a class: an
object of the class.
Example: simulating a tally counter
Counter tally = new Counter();
[Link]();
[Link]();
int result = [Link](); // Sets result to 2
Each counter needs to internally store a variable that keeps track
of the number of simulated button clicks.
Instance Variables
Instance variables store the data of an object.
- a storage location present in each object of the class.
The class declaration specifies the instance variables:
public class Counter
{
private int value;
...
}
An object's instance variables store the data required for
executing its methods.
Instance Variables
An instance variable declaration consists of the following parts:
access specifier (private) Who can see/use it?
type of variable (such as int)
name of variable (such as value)
You should declare all instance variables as private.
Syntax 3.1 Instance Variable Declaration
Instance Variables
These clocks have common behavior, but each of them has a
different state. Similarly, objects of a class can have their
instance variables set to different values.
The Methods of the Counter C l a s s
The click method advances the counter value by 1:
public void click()
{
value = value + 1;
}
Affects the value of the instance variable of the object on which the method is
invoked
To way to use it: call [Link]();
Advances the value variable of the concertCounter object
The Methods of the Counter C l a s s
The getValue method returns the current value:
public int getValue()
{
return value;
}
The return statement
Terminates the method call
Returns a result (the return value) to the method's caller
Private instance variables can only be accessed by methods of the
same class.
Encap s ulation
Encapsulation is the process of hiding implementation details
and providing methods for data access.
To encapsulate data:
Declare instance variables as private and
Declare public methods that access the variables
Encapsulation allows a programmer to use a class without
having to know its implementation.
Information hiding makes it simpler for the implementor of a class
to locate errors and change implementations.
Encap s ulation
A thermostat functions as a "black box" whose inner
workings are hidden.
When you assemble classes, like Car and String, into
programs you are like a contractor installing a thermostat.
When you implement your own classes you are like the
manufacturer who puts together a thermostat out of parts.
section_1/[Link]
1 /**
2 This class models a tally counter.
3 */
4 public class Counter
5 {
6 private int value;
7
8 /**
9 Gets the current value of this counter.
10 @return the current value
11 */
12 public int getValue()
13 {
14 return value;
15 }
16
17 /**
18 Advances the value of this counter by 1.
19 */
20 public void click()
21 {
22 value = value + 1;
23 }
24
25 /**
26 Resets the value of this counter to 0.
27 */
28 public void reset()
29 {
30 value = 0;
31 }
32 }
Specifying the Public Interface of a
Class
In order to implement a class, you first need to know which
methods are required.
Essential behavior of a bank account:
deposit money
withdraw money
get balance
We interact with a class through its public interface –
methods
Specifying the Public Interface of a
Class
We want to support method calls such as the following:
[Link](2000);
[Link](500);
[Link]([Link]());
Here are the method headers needed for a BankAccount class:
public void deposit(double amount)
public void withdraw(double amount)
public double getBalance()
Specifying the Public Interface of a
Class: Method Declaration
A method's body consisting of statements that are executed when
the method is called:
public void deposit(double amount)
{
implementation - f i l l e d i n l a t e r
}
You can fill in the method body so it compiles:
public double getBalance()
{
// TODO: fill in implementation
return 0;
}
Specifying the Public Interface of a
Class
BankAccount methods were declared as public.
public methods can be called by all other methods in the
program (whether within or outside of the same class)
Methods can also be declared private
private methods only be called by other methods in the same class
private methods are not part of the public interface
Specifying Constructors
Initialize objects
Set the initial data for objects
Similar to a method with two differences:
The name of the constructor is always the same as the name of the class
Constructors have no return type
Specifying Constructors: BankAccount
Two constructors
public BankAccount()
public BankAccount(double initialBalance)
Usage
BankAccount harrysChecking = new BankAccount();
BankAccount momsSavings = new BankAccount(5000);
Specifying Constructors: BankAccount
The constructor name is always the same as the class name.
The compiler can tell them apart because they take different
arguments.
A constructor that takes no arguments is called a no-argument
constructor.
BankAccount's no-argument constructor - header and body:
public BankAccount()
{
c o n s t r u c t o r b od y — im p le m e nt a t ion f i l l e d i n l a t e r
}
The statements in the constructor body will set the instance
variables of the object.
BankAccount Public Interface
The constructors and methods of a class go inside the class declaration:
public class BankAccount
{
// p r i v a t e i n s t a n c e v a r i a b l e s - - f i l l e d i n later
// Constructors
public BankAccount()
{
// b o d y - - f i l l e d i n l a t e r
}
public BankAccount(double initialBalance)
{
// b o d y - - f i l l e d i n l a t e r
}
// Methods
public void deposit(double amount)
{
// body--filled in later
}
public void withdraw(double amount)
{
// b o d y - - f i l l e d i n l a t e r
}
public double getBalance()
{
// b o d y - - f i l l e d i n l a t e r
}
}
Specifying the Public Interface of a
Class
public constructors and methods of a class form the public
interface of the class.
These are the operations that any programmer can use
Syntax 3.2 C l a s s Declaration
U s i n g the Public Interface
Example: transfer money
// Transfer from one account to another
double transferAmount = 500;
[Link](transferAmount);
[Link](transferAmount)
Example: add interest
double interestRate = 5; // 5 percent interest
double interestAmount = [Link]() * interestRate / 100;
[Link](interestAmount);
Programmers use objects of the BankAccount class to carry out
meaningful tasks
without knowing how the BankAccount objects store their data
without knowing how the BankAccount methods do their work
Commenting the Public Interface
Use documentation comments to describe the classes and
public methods of your programs.
Java has a standard form for documentation comments.
A program called javadoc can automatically generate a set of
HTML pages.
Documentation comment
placed before the class or method declaration that is being documented
Commenting the Public Interface -
Documenting a method
Start the comment with a /**.
Describe the method’s purpose.
Describe each parameter:
start with @param
name of the parameter that holds the argument a
short explanation of the argument
Describe the return value:
start with @return
describe the return value
Omit @param tag for methods that have no arguments.
Omit the @return tag for methods whose return type is void.
End with */
Commenting the Public Interface -
Documenting a method
Example:
/**
Withdraws money from the bank account.
@param amount the amount to withdraw
*/
public void withdraw(double amount)
{
implementation—filled i n l a t e r
}
Example:
/**
Gets the current balance of the bank account.
@return the current balance
*/
public double getBalance()
{
implementation—filled i n later
}
Commenting the Public Interface -
Documenting a class
Place above the class declaration.
Supply a brief comment explaining the class's purpose.
Example:
/**
A bank account has a balance that can be changed by
deposits and withdrawals.
*/
public class BankAccount
{
. . .
}
Provide documentation comments for:
every class
every method
every parameter variable
every return value
Method Summary
Figure 3 A Method Summary Generated by javadoc
Method Details
Figure 4 Method Detail Generated by javadoc
Providing the C l a s s Implementation
The private implementation of a class consists of:
instance variables
the bodies of constructors
the bodies of methods.
Providing Instance Variables
Determine the data that each bank account object contains.
What does the object need to remember so that it can carry out its
methods?
Each bank account object only needs to store the current balance.
BankAccount instance variable declaration:
public class BankAccount
{
private double balance;
// Methods and constructors below
. . .
}
Providing Instance Variables
Like a wilderness explorer who needs to carry all
items that may be needed, an object needs to
store the data required for its method calls.
Providing Constructors
Constructor's job is to initialize the instance variables of the object.
The no-argument constructor sets the balance to zero.
public BankAccount()
{
balance = 0;
}
The second constructor sets the balance to the value supplied as
the construction argument.
public BankAccount(double initialBalance)
{
balance = initialBalance;
}
Providing Constructors - Tracing the
Statement
Steps carried out when the following statement is executed:
BankAccount harrysChecking = new BankAccount(1000);
Create a new object of type BankAccount.
Call the second constructor
because an argument is supplied in the constructor call
Set the parameter variable initialBalance to 1000.
Set the balance instance variable of the newly created object to
initialBalance.
Return an object reference, that is, the memory location of the
object.
Store that object reference in the harrysChecking variable.
Providing Constructors - Tracing the
Statement
Figure 5 How a Constructor Works
Providing Methods
Is the method an accessor or a mutator
Mutator method
Update the instance variables in some way
Accessor method
Retrieves or computes a result
deposit method - a mutator method
Updates the balance
public void deposit(double amount)
{
balance = balance + amount;
}
Providing Methods - continued
withdraw method - another mutator
public void withdraw(double amount)
{
balance = balance - amount;
}
getBalance method - an accessor method
Returns a value
public double getBalance()
{
return balance;
}
Unit Testing
[Link] can not be executed:
It has no main method
Most classes do not have a main method
Before using [Link] in a larger program:
You should test in isolation
Unit test: verifies that a class works correctly in isolation, outside a
complete program.
Unit Testing
To test a class, either
use an environment for interactive testing, or
write a tester class to execute test instructions.
Tester class: a class with a main method that contains statements
to test another class.
Typically carries out the following steps:
1. Construct one or more objects of the class that is being tested
2. Invoke one or more methods
3. Print out one or more results
4. Print the expected results
section_4/[Link]
1 /**
2 A class to test the BankAccount class.
3 */
4 public class BankAccountTester
5 {
6 /**
7 Tests the methods of the BankAccount class.
8 @param args not used
9 */
10 public static void main(String[] args)
11 {
12 BankAccount harrysChecking = new BankAccount();
13 [Link](2000);
14 [Link](500);
15 [Link]([Link]());
16 [Link]("Expected: 1500");
17 }
18 }
Program Run:
1500
Expected: 1500
Unit Testing - Building a program
To produce a program: combine both BankAccount and
BankAccountTester classes.
Details for building the program vary.
In most environments, you need to carry out these steps:
1. Make a new subfolder for your program
2. Make two files, one for each class
3. Compile both files
4. Run the test program
BankAccount and BankAccountTest have entirely different
purposes:
BankAccount class describes objects that compute bank balances
BankAccountTester class runs tests that put a BankAccount object
through its paces
Local Variables
Local variables are declared in the body of a method:
public double giveChange()
{
double change = payment - purchase;
purchase = 0;
payment = 0;
return change;
}
When a method exits, its local variables are removed.
Parameter variables are declared in the header of a method:
public void enterPayment(double amount)
Local Variables
Local and parameter variables belong to methods:
When a method runs, its local and parameter variables come to life
When the method exits, they are removed immediately
Instance variables belong to objects, not methods:
When an object is constructed, its instance variables are created
The instance variables stay alive until no method uses the object any longer
Instance variables are initialized to a default value:
Numbers are initialized to 0
Object references are set to a special value called null
A null object reference refers to no object at all
You must initialize local variables:
The compiler complains if you do not
The t h i s Reference
Two types of inputs are passed when a method is called:
The object on which you invoke the method
The method arguments
In the call [Link](500) the method needs to
know:
The account object (momsSavings)
The amount being deposited (500)
The implicit parameter of a method is the object on which the
method is invoked.
All other parameter variables are called explicit parameters.
The t h i s Reference
Look at this method:
public void deposit(double amount)
{
balance = balance + amount;
}
amount is the explicit parameter
The implicit parameter(momSavings) is not seen
balance means [Link]
When you refer to an instance variable inside a method, it means
the instance variable of the implicit parameter.
The t h i s Reference
The this reference denotes the implicit parameter
balance = balance + amount;
actually means
[Link] = [Link] + amount;
When you refer to an instance variable in a method, the
compiler automatically applies it to the this reference.
The t h i s Reference
Some programmers feel that inserting the this reference
before every instance variable reference makes the code
clearer:
public BankAccount(double initialBalance)
{
[Link] = initialBalance;
}
The t h i s Reference
Figure 7 The Implicit Parameter of a Method Call
The t h i s Reference
The this reference can be used to distinguish between
instance variables and local or parameter variables:
public BankAccount(double balance)
{
[Link] = balance;
}
A local variable shadows an instance variable with the same
name.
You can access the instance variable name through the this reference.
In Java, local and parameter variables are considered first when
looking up variable names.
Statement
[Link] = balance;
means: "Set the instance variable balance to the parameter
variable balance".
The t h i s Reference
A method call without an implicit parameter is applied to the same
object.
Example:
public class BankAccount
{
. . .
public void monthlyFee()
{
withdraw(10); // Withdraw $10 from this account
}
}
The implicit parameter of the withdraw method is the (invisible)
implicit parameter of the monthlyFee method
You can use the this reference to make the method easier to
read:
public class BankAccount
{
. . .
public void monthlyFee()
{
[Link](10); // Withdraw $10 from this account
}
}