Computer Science 15-100, Summer 2009
Class Notes:  Getting Started with Writing Classes


Getting Started with Writing Classes

Here is RatioDemo.java, containing the Ratio class and the RatioDemo class as we wrote them in today's lecture:

import java.util.*;
public class RatioDemo {
  public static void main(String[] args) {
    testRatioClass();
  }
  public static void testRatioClass() {
    System.out.println("Constructing new Ratio(2,4):");
    Ratio ratio = new Ratio(2,4); // 2/4 --> 1/2
    System.out.println("  ratio = " + ratio);
    System.out.println("Call to setNum(2) mutator:");
    ratio.setNum(2); // 2/2 --> 1/1
    System.out.println("  ratio = " + ratio);
    System.out.println("Call to getNum accessor:");
    System.out.println("  ratio.getNum() = " + ratio.getNum());
    System.out.println("Constructing 2/4 and 3/6:");
    Ratio r1 = new Ratio(2,4);
    Ratio r2 = new Ratio(3,6);
    System.out.println("  r1 = " + r1);
    System.out.println("  r2 = " + r2);
    System.out.println("Testing various equals/== values:");
    System.out.println("   (r1 == r2)         : " + (r1 == r2));
    System.out.println("   (r1.equals(r2))    : " + (r1.equals(r2)));
    System.out.println("   (r1.equals(\"foo\")) : " + (r1.equals("foo")));
    System.out.println("   (r1.equals(null))  : " + (r1.equals(null)));
    System.out.println("Testing multiplication:");
    // Ratio r3 = r1 * r2; // won't work, no operator overloading (darn)
    Ratio r3 = r1.times(r2);
    System.out.println("  " + r1 + " * " + r2 + " = " + r3);
    System.out.println("Testing addition:");
    // Ratio r4 = r2 + r3; // won't work, no operator overloading (darn)
    Ratio r4 = r2.add(r3);
    System.out.println("  " + r2 + " + " + r3 + " = " + r4);    
  }
}
class Ratio {
  // The properties of a Ratio (aka, "fields")
  private int num;
  private int den;
  // accessors
  public int getNum() {
    return this.num;
  }
  public int getDen() {
    return this.den;
  }  
  // mutators
  public void setNum(int num) {
    this.num = num;
    reduce();
  }
  public void setDen(int den) {
    this.den = den;
    reduce();
  }  
  // reduce helper method
  private void reduce() {
    int gcd = gcd(this.num, this.den);
    this.num = this.num/gcd;
    this.den = this.den/gcd;
  }  
  // gcd helper method
  private static int gcd(int x, int y) {
    x = Math.abs(x);
    y = Math.abs(y);
    while (y != 0) {
      int r = x % y;
      x = y;
      y = r;
    }
    return x;
  }
  // Constructor
  public Ratio(int num, int den) {
    this.num = num;
    this.den = den;
    reduce();
  }  
  // times method
  public Ratio times(Ratio that) {
    int num = this.num * that.num;
    int den = this.den * that.den;
    return new Ratio(num, den);
  }  
  // add method
  // a/b + c/d = ad/bd + bc/bd = (ad + bc)/bd
  public Ratio add(Ratio that) {
    int a = this.num, b = this.den;
    int c = that.num, d = that.den;
    int num = (a*d + b*c);
    int den = b*d;
    return new Ratio(num, den);
  }
  // toString method
  public String toString() {
    // return "Ratio(" + this.num + "/" + this.den + ")";
    return this.num + "/" + this.den;
  }  
  // equals method
  public boolean equals(Object object) {
    if (object == null)
      return false;
    if ((object instanceof Ratio) == false)
      return false;
    Ratio that = (Ratio)object;
    // compare this and that
    return ((this.num == that.num) &&
            (this.den == that.den));
  }
}

carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem