// CS100J Spring 2001
// Lecture 12, 3/1
// mechanics of objects

class Person {

    public String name;       // name of current Person
    public Person friend;     // friend of current Person is also a Person

    public Person(String s) {
	name=s;
    } 
    
    // method for setting value of $friend$:
    public void set_friend(Person p) {
	friend = p;
    }

    // using $toString$ to print description of current object:
    public String toString() {
	return "Name of person: "+name+"; Name of friend: "+friend.name;
    }
}

public class lecture12_slim {
    public static void main(String[] args) {
	
	// create 4 new people:
	   Person a = new Person("Dave");
	   Person b = new Person("Jeff");
	   Person c = new Person("Nate");
	   Person d = new Person("Tony");

	// Dave's friend is Jeff
	   a.set_friend(b);
	
        // Description of Dave:
	   System.out.println("Part 1:");
	   System.out.println(a.toString()); // redundant!
	   System.out.println(a);            // correct!

        // Creating objects as inputs and return values:
	   System.out.println("Part 2:");
	   b.set_friend(new Person("Alan"));
	   System.out.println(b);

        // Person ref by $c$ becomes Person ref by $d$
	   c = d; 
 
        // Jeff becomes friend of Tony:
	   System.out.println("Part 3:");
	   c.set_friend(b);
           System.out.println(a);
           System.out.println(b);
	   System.out.println(c);
           System.out.println(d);
    }
    
}

/* output:
Part 1:
Name of person: Dave; Name of friend: Jeff
Name of person: Dave; Name of friend: Jeff
Part 2:
Name of person: Jeff; Name of friend: Alan
Part 3:
Name of person: Dave; Name of friend: Jeff
Name of person: Jeff; Name of friend: Alan
Name of person: Tony; Name of friend: Jeff
Name of person: Tony; Name of friend: Jeff
*/