Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Objectives • Be able to write overloaded methods • Be able to write equals and t

ID: 664674 • Letter: O

Question

Objectives

• Be able to write overloaded methods

• Be able to write equals and toString methods

• Be able to use objects made up of other objects (Aggregation)

• Be able to write methods that pass and return objects

Introduction

We discussed objects in Chapter 6 and we modeled a television in the Chapter 6. We want build on that exercise, and work more with objects. This time, the object that we are choosing is more complicated. It is made up of other objects. This is called aggregation. A credit card is an object that is very common, but not as simple as a television. Attributes of the credit card include information about the owner, as well as a balance and credit limit. These things would be our instance fields. A credit card allows you to make payments and charges. These would be methods. As we have seen before, there would also be other methods associated with this object in order to construct the object and access its fields.

Examine the UML diagram that follows. Notice that the instance fields in the CreditCard class are other types of objects, a Person object or a Money object. We can say that the CreditCard “has a” Person, which means aggregation, and the Person object “has a” Address object as one of its instance fields. This aggregation structure can create a very complicated object. I will try to keep this lab reasonably simple.

To start with, we will be editing a partially written class, Money. We will investigate overloading methods by writing another constructor method. The constructor that you will be writing is a copy constructor. This means it should create a new object, but with the same values in the instance variables as the object that is being copied.

Next, we will write equals and toString methods. These are very common methods that are needed when you write a class to model an object. You will also see a compareTo method that is also a common method for objects.

After we have finished the Money class, we will write a CreditCard class. This class contains Money objects, so you will use the methods that you have written to complete the Money class. The CreditCard class will explore passing objects and the possible security problems associated with it. We will use the copy constructor we wrote for the Money class to create new objects with the same information to return to the user through the accessor methods.

Task #1 Overloading by Writing a Copy Constructor

1. Refer to class handout, the files Address.java, Person.java, Money.java, MoneyDriver.java, andCreditCardDemo.java.

Address.java, Person.java, MoneyDemo.java, and CreditCardDemo.java are complete and will not need to be modified. We will start by modifying Money.java.

2. Overload the constructor. The constructor that you will write will be a copy constructor. It should use the parameter money object to make a duplicate money object, by copying the value of each instance variable from the parameter object to the instance variable of the new object.

Task #2 Writing equals and toString methods

1. Write and document an equals method. The method compares the instance variables of the calling object with instance variables of the parameter object for equality and returns true if the dollars and the cents of the calling object are the same as the dollars and the cents of the parameter object. Otherwise, it returns false.

2. Write and document a toString method. This method will return a String that looks like money, including the dollar sign. Remember that if you have less than 10 cents, you will need to put a 0 before printing the cents so that it appears correctly with 2 decimal places.

3. Compile, debug, and test by running the MoneyDriver.java driver program. You should get the output:

The current amount is $500.00

Adding $10.02 gives $510.02

Subtracting $10.88 gives $499.14

$10.02 equals $10.02

$10.88 does not equal $10.02

Task #3 Passing and Returning Objects

1. Create a CreditCard class according to the UML Diagram on the back. It should have data fields that include an owner of type Person, a balance of type Money, and a creditLimit of type Money.

2. It should have a constructor that has two parameters, a Person to initialize the owner and a Money value to initialize the creditLimit. The balance can be initialized to a Money value of zero. Remember you are passing in objects (pass by reference), so you have passed in the address to an object. If you want your

CreditCard to have its own creditLimit and balance, you should create a new object of each using the copy constructor in the Money class.

3. It should have accessor methods to get the balance and the available credit. Since these are objects (pass by reference), we don’t want to create an insecure credit card by passing out addresses to components in our credit card, so we must return a new object with the same values. Again, use the copy constructor

to create a new object of type money that can be returned.

4. It should have an accessor method to get the information about the owner, but in the form of a String that can be printed out. This can be done by calling the toString method for the owner (who is a Person).

5. It should have a method that will charge to the credit card by adding the amount of Money in the parameter to the balance if it will not exceed the credit limit. If the credit limit will be exceeded, the amount should not be added, and an error message can be printed to the console.

6. It should have a method that will make a payment on the credit card by subtracting the amount of Money in the parameter from the balance.

7. Compile, debug, and test it out completely by running CreditCardDemo.java.

You should get the output:

Diane Christie, 237J Harvey Hall, Menomonie, WI

54751

Balance: $0.00

Credit Limit: $1000.00

Attempt to charge $200.00

Charge: $200.00

Balance: $200.00

Attempt to charge $10.02

Charge: $10.02

Balance: $210.02

Attempt to pay $25.00

Payment: $25.00

Balance: $185.02

Attempt to charge $990.00

Exceeds credit limit

Balance: $185.02

Explanation / Answer

Address.java

package com.tutai;

public class Address {
   private String street;
   private String city;
   private String state;
   private String zip;
   public String toString(){
       String str="Street: "+street;
       str+=" City: "+city;
       str+=" State: "+state;
       str+=" Zip: "+zip;
       return str;
   }
}

Person.java

package com.tutai;

public class Person {
   private String lastName;
   private String firstName;
   private Address home;
   public String toString(){
       String str="Last Name: "+lastName;
       str+=" First Name: "+firstName;
       str+=" Address: "+home.toString();
       return str;
   }
}

Money.java

package com.tutai;

public class Money {
   private long dollars;
   private long cents;
   public Money(){
       dollars=0;
       cents=0;
   }
   public Money(double amount){
       String amt=""+amount;
       String[] values=amt.split(".");
       dollars=Long.parseLong(values[0]);
       cents=Long.parseLong(values[1]);
   }
   public Money(Money otherObject){
       this.dollars=otherObject.dollars;
       this.cents=otherObject.cents;
   }
   public Money add(Money otherAmount){
       Money m=new Money();
       m.dollars=this.dollars+otherAmount.dollars;
       m.cents=this.cents+otherAmount.cents;
       return m;
   }
   public Money subtract(Money otherAmount){
       Money m=new Money();
       m.dollars=this.dollars-otherAmount.dollars;
       m.cents=this.cents-otherAmount.cents;
       return m;
   }
   public int compareTo(Money otherObject){
       if(this.dollars<otherObject.dollars)
           return -1;
       else
           return 1;
   }
   public boolean equals(Money otherAmount){
       if(this.dollars==otherAmount.dollars&&this.cents==otherAmount.cents)
           return true;
       else
           return false;
   }
   public String toString(){
       String str="Dollars: "+dollars;
       if(cents<10){
           str+=" Cents: 0"+cents;
       }else{
           str+=" Cents: "+cents;
       }
       return str;
   }
}

CreditCard.java

package com.tutai;

public class CreditCard {
   private Money balance;
   private Money creditLimit;
   private Person owner;
   public CreditCard(Person newCardHolder,Money limit){
       this.owner=newCardHolder;
       this.creditLimit=limit;
   }
   public Money getBalance(){
       return balance;
   }
   public Money getCreditLimit(){
       return creditLimit;
   }
   public String getPersonals(){
       return owner.toString();
   }
   public void charge(Money amount){
       if(balance.add(amount).compareTo(creditLimit)==1){
           balance.subtract(amount);
       }
   }
   public void payment(Money amount){
       balance.subtract(amount);
   }
}