public class Fraction { private static int numberOfFractions = 0; private int numerator; private int denominator; public Fraction(int theNum, int theDen) { // initializing instance data from the parameters numerator = theNum; denominator = theDen; numberOfFractions++; } // accessor methods public int getNumerator() { return numerator; } public int getDenominator() { return denominator; } // mutator methods public void setNumerator(int theNumerator) { numerator = theNumerator; } public void setDenominator(int theDenominator) { denominator = theDenominator; } public String toString() { String result; result = numerator + "/" + denominator + " (" + ((double)numerator)/denominator + ")"; return result; } public static Fraction multiplyVersion1(Fraction f1, Fraction f2) { Fraction newFraction; newFraction = new Fraction(f1.getNumerator() * f2.getDenominator(), f1.getDenominator() * f2.getDenominator()); return newFraction; } public static Fraction multiplyVersion2(Fraction f1, Fraction f2) { Fraction newFraction; // Why are we able to access the private members of the class? newFraction = new Fraction(f1.numerator * f2.denominator, f1.denominator * f2.denominator); return newFraction; } public static Fraction random(int maxValue) { int randomNum = (int)(Math.random() * maxValue) + 1; int randomDen = (int)(Math.random() * maxValue) + 1; return new Fraction(randomNum, randomDen); } public static int getTotalInstances() { return numberOfFractions; } public void square() { numerator *= numerator; denominator *= denominator; } }