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