How are you. 

public class Fraction {
 
  public static void main(String[] args) {
    System.out.println(new Fraction()); // Fraction@7084319d
    System.out.println(new Fraction()); // Fraction@54f4996b
  }
}

If you have no constructor they will give one: the default no arg constructor. 

If you specify at least one constructor you don't get anything else, just the constructor(s) you specified. 

public class Fraction {
  int num, den;
  public Fraction(int a, int b) {
    num = a; 
    den = b;
  }
  public static void main(String[] args) {
    // System.out.println(new Fraction()); // doesn't work anymore
    System.out.println(new Fraction(1, 2)); // Fraction@54f4996b
  }
}

Now I do this:

public class Fraction {
  int num, den;
  public Fraction(int a, int b) {
    num = a; 
    den = b;
  }
  public void show() {
    System.out.println(num + "/" + den);  
  }
  public static void main(String[] args) {
    Fraction a = new Fraction(1, 2); 
    a.show(); // 1/2
    System.out.println(a); // Fraction@f2c2ea5 
  }
}


I want to print the SSN of the fraction from inside. Can I? 

public class Fraction {
  int num, den;
  public Fraction(int a, int b) {
    num = a; 
    den = b;
  }
  public void show() {
    System.out.println("From show: " + this); // Fraction@f2c2ea5 
    System.out.println(num + "/" + den);  
  }
  public static void main(String[] args) {
    Fraction a = new Fraction(1, 2); 
    a.show(); // 1/2
    System.out.println("From main: " + a); // Fraction@f2c2ea5 
  }
}

So we use the this keyword. 

public class Fraction {
  int num, den;
  public Fraction(int num, int den) {
    this.num = num; 
    this.den = den;
  }
  public void show() {
    System.out.println("From show: " + this); // Fraction@f2c2ea5 
    System.out.println(num + "/" + den);  
  }
  public static void main(String[] args) {
    Fraction a = new Fraction(1, 2); 
    a.show(); // 1/2
    System.out.println("From main: " + a); // Fraction@f2c2ea5 
    a.num = 3; // a is here what this is inside a 
    a.show(); // 3/2 
  }
}

Two numbers: 6 and 18. What is the GCD? 

Two more numbers: 30 and 6. GCD is 6. 

GCD(13, 13) = 13. 

GCD(50, 35) = ? 

    50      = 2 * 5 * 5
        35  =         5 * 7
--------------------------------
GCD(50, 35) =         5

Someone says: 

     GCD(a, b) = a           if a == b
                 GCD(a-b, b) if a > b
                 GCD(a, b-a) otherwise (that is, if a < b)
       a   b
   GCD(50, 35) = GCD(50-35, 35) =
               = GCD(15   , 35) = 
               = GCD(15, 35-15) = 
               = GCD(15,    20) = 
               = GCD(15, 20-15) = 
               = GCD(15,     5) = 
               = GCD(15-5,   5) = 
               = GCD(10,     5) = 
               = GCD(10-5,   5) =
               = GCD(5,      5) = 5

So we have this:

public class Fraction {
  public static int gcd(int a, int b) {
    if (a == b) {
      return a;
    } else if (a > b) {
      return Fraction.gcd(a-b, b);  
    } else {
      return Fraction.gcd(a, b-a);  
    }
  }
  int num, den;
  public Fraction(int num, int den) {
    this.num = num; 
    this.den = den;
  }
  public Fraction add(Fraction other) {
    int num = this.num * other.den + this.den * other.num;
    int den = this.den * other.den;
    int gcd = Fraction.gcd(num, den); 
    return new Fraction(num/gcd, den/gcd); 
  }
  public void show() {
    System.out.println("From show: " + this); // Fraction@f2c2ea5 
    System.out.println(num + "/" + den);  
  }
  public static void main(String[] args) {
    Fraction a = new Fraction(1, 2); 
    a.show(); // 1/2
    System.out.println("From main: " + a); // Fraction@f2c2ea5 
    a.num = 3; // a is here what this is inside a 
    a.show(); // 3/2 
    System.out.println(Fraction.gcd(50, 35)); // 5
    Fraction b = new Fraction(1, 2); 
    Fraction c = a.add(b);
    c.show(); // 2/1
    Fraction m = new Fraction(3, 5); 
    Fraction n = new Fraction(1, 3); 
    Fraction result = Fraction.add(m, n); 
    result.show(); // 14/15
  }
  public static Fraction add(Fraction a, Fraction b) {
    int num = a.num * b.den + a.den * b.num; 
    int den = a.den * b.den; 
    int gcd = Fraction.gcd(num, den); 
    Fraction c = new Fraction(num/gcd, den/gcd); 
    return c; 
  }
}

We also provided a static version of add just to see how it works. 

--