CSE115: Introduction to Computer Science I Dr. Carl Alphonce 219 Bell Hall
Announcements Exam 2 – less than 2 weeks away –covers material from exam 1 up to & including 10/15 –review on Monday 10/18 –exam on Wednesday 10/20
Agenda association relationship –null –this
Parameter list difference public void setCollar (Collar collar) public Collar getCollar () Accessors and mutators can be defined for any of the instance variables declared in a class. A mutator method needs a value to set the instance variable to. The mutator method is parameterized in its behavior. An accessor method always does the same thing: it returns the current value of the instance variable. The accessor method is therefore not parameterized in its behavior.
What about public/private? They are access control modifiers: they control access to members of a class (instance variables and methods are called members). A member which is public can be accessed from outside of the class definition. This is the least restrictive form of access control. A member which is private can only be accessed from inside the class definition. This is the most restrictive form of access control.
Why accessors/mutators? Why use accessors and mutators, rather than just make instance variables public? public grants both read/write access. With accessors/mutators you can be selective in allowing just one or the other (or both). Accessors/mutators are methods, and can do more than simply grant read/write access to instance variables (Bank account example). Accessors/mutators can exist for “virtual” instance variables: –Many graphical objects provide both a getLocation/setLocation pair, as well as a getCenterLocation/setCenterLocation pair. In reality, only one location is stored, the other is calculated. Which is stored? Who cares? The client of the code does not need to know – the methods will do the right thing. The implementation can even change and the methods will still work correctly.
Shape s1 = new Shape(java.awt.Color.BLUE); Shape s2 = new Shape(java.awt.Color.RED); public class Shape { private java.awt.Color _color; public Shape(java.awt.Color c) { _color = c; }... } Example 1
Shape s1 = new Shape(java.awt.Color.BLUE); Shape s2 = new Shape(java.awt.Color.RED); Example 1 s1 Shape _color s2 BLUE Shape _color RED
public class Shape { private java.awt.Color _color; public Shape(java.awt.Color c) { _color = c; } public java.awt.Color getColor() { return _color; } public void setColor(java.awt.Color c) { _color = c; }
Shape s1 = new Shape(java.awt.Color.BLUE); Shape s2 = new Shape(java.awt.Color.RED); s2.setColor(s1.getColor()); Example 1 s1 Shape _color s2 BLUE Shape _color RED
Result? Both shapes have the same color (java.awt.Color.BLUE). This is OK.
Dog fido = new Dog(new Collar()); Dog dino = new Dog(new Collar()); Example 2 fido Dog _collar dino Dog _collar
Dog fido = new Dog(new Collar()); Dog dino = new Dog(new Collar()); dino.setCollar(fido.getCollar()); Example 2 fido Dog _collar dino Dog _collar ???
Result? Both dogs have the same collar. ?!? Second collar is “lost”. :-(
What could we do instead?
‘null’ ‘null’ denotes the null reference, a reference which does not refer to any object. We can use ‘null’ to solve the two dogs, one collar problem (see code on next slide):
removeCollar rather than getCollar public class Dog { private Collar _collar; public Dog(Collar collar) { _collar = collar; } public void setCollar(Collar collar) { _collar = collar; } public Collar removeCollar() { Collar temp = _collar; _collar = null; return _collar; }