Chapter 4: Writing Classes (1)
Lab Exercises
Topics Lab Exercises
Classes and methods Prelab Exercises (in class)
A Bank Account Class (submit)
Tracking Grades (submit)
A Band Booster Class (extra credit)
Prelab Exercises
1. Constructors are special methods included in class definitions.
a. What is a constructor used for?
b. How do constructors differ from other methods in a class?
2. Both methods and variables in a class are declared as either private or public. Describe the difference between private and public and indicate how a programmer decides which parts of a class should be private and which public.
3. Consider a class that represents a bank account.
a. Such a class might store information about the account balance, the name of the account holder, and an account number. What instance variables would you declare to hold this information? Give a type and name for each.
b. There are a number of operations that would make sense for a bank account—withdraw money, deposit money, check the balance, and so on. Write a method header with return type, name, and parameter list, for each such operation described below. Don't write the whole method—just the header. They will all be public methods. The first one is done for you as an example.
i. Withdraw a given amount from the account. This changes the account balance, but does not return a value.
public void withdraw(double amount)
ii. Deposit a given amount into the account. This changes the account balance, but does not return a value.
iii. Get the balance from the account. This does not change anything in the account; it simply returns the balance.
iv. Return a string containing the account information (name, account number, balance). This does not change anything in the account.
v. Charge a $10 fee. This changes the account balance but does not return a value.
vi. Create a new account given an initial balance, the name of the owner, and the account number. Note that this will be a constructor, and that a constructor does not have a return type.
A Bank Account Class
1. File Account.java contains a partial definition for a class representing a bank account. Save it to your directory and study it to see what methods it contains. Then complete the Account class as described below. Note that you won't be able to test your methods until you write ManageAccounts in question #2.
a. Fill in the code for method toString, which should return a string containing the name, account number, and balance for the account.
b. Fill in the code for method chargeFee, which should deduct a service fee from the account.
c. Modify chargeFee so that instead of returning void, it returns the new balance. Note that you will have to make changes in two places.
d. Fill in the code for method changeName which takes a string as a parameter and changes the name on the account to be that string.
2. File ManageAccounts.java contains a shell program that uses the Account class above. Save it to your directory, and complete it as indicated by the comments.
3. Modify ManageAccounts so that it prints the balance after the calls to chargeFees. Instead of using the getBalance method like you did after the deposit and withdrawal, use the balance that is returned from the chargeFees method. You can either store it in a variable and then print the value of the variable, or embed the method call in a println statement.
//*******************************************************
// Account.java
//
// A bank account class with methods to deposit to, withdraw from,
// change the name on, charge a fee to, and print a summary of the account.
//*******************************************************
public class Account
{
private double balance;
private String name;
private long acctNum;
//----------------------------------------------
//Constructor -- initializes balance, owner, and account number
//----------------------------------------------
public Account(double initBal, String owner, long number)
{
balance = initBal;
name = owner;
acctNum = number;
}
//----------------------------------------------
// Checks to see if balance is sufficient for withdrawal.
// If so, decrements balance by amount; if not, prints message.
//----------------------------------------------
public void withdraw(double amount)
{
if (balance >= amount)
balance -= amount;
else
System.out.println("Insufficient funds");
}
//----------------------------------------------
// Adds deposit amount to balance.
//----------------------------------------------
public void deposit(double amount)
{
balance += amount;
}
//----------------------------------------------
// Returns balance.
//----------------------------------------------
public double getBalance()
{
return balance;
}
//----------------------------------------------
// Returns a string containing the name, account number, and balance.
//----------------------------------------------
public String toString()
{
}
//----------------------------------------------
// Deducts $10 service fee
//----------------------------------------------
public void chargeFee()
{
}
//----------------------------------------------
// Changes the name on the account
//----------------------------------------------
public void changeName(String newName)
{
}
}
// ****************************************************************
// ManageAccounts.java
//
// Use Account class to create and manage Sally and Joe's
// bank accounts
// ****************************************************************
public class ManageAccounts
{
public static void main(String[] args)
{
Account acct1, acct2;
//create account1 for Sally with $1000
acct1 = new Account(1000, "Sally", 1111);
//create account2 for Joe with $500
//deposit $100 to Joe's account
//print Joe's new balance (use getBalance())
//withdraw $50 from Sally's account
//print Sally's new balance (use getBalance())
//charge fees to both accounts
//change the name on Joe's account to Joseph
//print summary for both accounts
}
}
Tracking Grades
A teacher wants a program to keep track of grades for students and decides to create a student class for his program as follows:
· Each student will be described by three pieces of data: his/her name, his/her score on test #1, and his/her score on test #2.
· There will be one constructor, which will have one argument—the name of the student.
· There will be three methods: getName, which will return the student's name; inputGrades, which will prompt for and read in the student's test grades; and getAverage, which will compute and return the student's average.
1. File Student.java contains an incomplete definition for the Student class. Save it to your directory and complete the class definition as follows:
a. Declare the instance data (name, score for test1, and score for test2).
b. Create a Scanner object for reading in the scores.
c. Add the missing method headers.
d. Add the missing method bodies.
System.out.println("Student 1: " + student1);
This should compile, but notice what it does when you run it—nothing very useful! When an object is printed, Java looks for a toString method for that object. This method must have no parameters and must return a String. If such a method has been defined for this object, it is called and the string it returns is printed. Otherwise the default toString method, which is inherited from the Object class, is called; it simply returns a unique hexadecimal identifier for the object such as the ones you saw above.
Add a toString method to your Student class that returns a string containing the student's name and test scores, e.g.:
Name: Joe Test1: 85 Test2: 91
Note that the toString method does not call System.out.println—it just returns a string.
Recompile your Student class and the Grades program (you shouldn't have to change the Grades program—you don't have to call toString explicitly). Now see what happens when you print a student object—much nicer!
// ****************************************************************
// Student.java
//
// Define a student class that stores name, score on test 1, and
// score on test 2. Methods prompt for and read in grades,
// compute the average, and return a string containing student’s info.
// ****************************************************************
import java.util.Scanner;
public class Student
{
//declare instance data
//-----------------------------------------------
//constructor
//-----------------------------------------------
public Student(String studentName)
{
//add body of constructor
}
//-----------------------------------------------
//inputGrades: prompt for and read in student's grades for test1 and test2.
//Use name in prompts, e.g., "Enter's Joe's score for test1".
//-----------------------------------------------
public void inputGrades()
{
//add body of inputGrades
}
//-----------------------------------------------
//getAverage: compute and return the student's test average
//-----------------------------------------------
//add header for getAverage
{
//add body of getAverage
}
//-----------------------------------------------
//getName: print the student's name
//-----------------------------------------------
//add header for printName
{
//add body of printName
}
}
// ****************************************************************
// Grades.java
//
// Use Student class to get test grades for two students
// and compute averages
//
// ****************************************************************
public class Grades
{
public static void main(String[] args)
{
Student student1 = new Student("Mary");
//create student2, "Mike"
//input grades for Mary
//print average for Mary
System.out.println();
//input grades for Mike
//print average for Mike
}
}
Band Booster Class
In this exercise, you will write a class that models a band booster and use your class to update sales of band candy.
1. Write the BandBooster class assuming a band booster object is described by two pieces of instance data: name (a String) and boxesSold (an integer that represents the number of boxes of band candy the booster has sold in the band fundraiser). The class should have the following methods:
· A constructor that has one parameter—a String containing the name of the band booster. The constructor should set boxesSold to 0.
· A method getName that returns the name of the band booster (it has no parameters).
· A method updateSales that takes a single integer parameter representing the number of additional boxes of candy sold. The method should add this number to boxesSold.
· A toString method that returns a string containing the name of the band booster and the number of boxes of candy sold in a format similar to the following:
Joe: 16 boxes
2. Write a program that uses BandBooster objects to track the sales of 2 band boosters over 3 weeks. Your program should do the following:
· Read in the names of the two band boosters and construct an object for each.
· Prompt for and read in the number of boxes sold by each booster for each of the three weeks. Your prompts should include the booster's name as stored in the BandBooster object. For example,
Enter the number of boxes sold by Joe this week:
For each member, after reading in the weekly sales, invoke the updateSales method to update the total sales by that member.
· After reading the data, print the name and total sales for each member (you will implicitly use the toString method here).