// Lecture 13 
// Person example from Lecture12, but now with encapsulation

class Person {
    private String name;       // name of current Person
    private Person friend;     // friend of current Person is also a Person

    // Create new Person with $name$:
    public Person(String n) {
	name=n;
    } 

    // Set value of $friend$:
    public void set_friend(Person p) {
	friend = p;
    }

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

public class L13_person {
    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");

	// Ira's friend is Jeff
	   a.set_friend(b);

        // Description of Ira:
	   System.out.println("Part 1:");
	   System.out.println(a);

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

        // Aliases
        // if you assign a reference to an object to another reference
        // an object gets obliterated...which one?

	   c = d; 
	   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
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
*/



