Chapter 5 Ch 1 – Introduction to Computers and Java Defining Classes and Methods 1 Chapter 5 5.1 Class and Method Definitions 5.2 Information Hiding and Encapsulation 5.3 Objects and References 5.4 Graphics Supplement 2 5.1 Class and Method Definitions Class Name Instance Variables Methods 3 Java is Object Oriented It can model any real world object 4 A class is a blueprint of what an object will look like 5 The object is just an instance of the class 6 Object Oriented Programming deals with the creation of objects and their relationships and interactions 7 Start by defining the class Car - bodyPaintColor: Color - numberOfTires: int instance variables + + + + instance methods getBodyPaintColor(): Color setBodyPaintColor(Color color): void getNumberOfTires(): int setNumberOfTires(int tireCount): void Use a UML class diagram 8 Code the class definition public class Car { private Color bodyPaintColor; private int numberOfTires; instance variables public Color getPaintColor() { return bodyPaintColor; } // end getPaintColor() public void setPaintColor(Color color) { bodyPaintColor = color; } // end setPaintColor() public int getNumberOfTires() { return numberOfTires; } // end getNumberOfTires() instance methods public void setNumberOfTires(int tireCount) { numberOfTires = tireCount; } // end setNumberOfTires() } // end Car 9 An Object consists of data ... greenCar bodyPaintColor Color.Green numberOfTires 4 object's memory footprint 10 and operations that store and manage the data methods are shared by all car objects Class Car methods bodyPaintColor Color.Green bodyPaintColor Color.Red numberOfTires 4 numberOfTires 4 greenCar redCar 11 Each class should be in a separate file public class Car { // code omitted } // end Car Car.java public class Driver { // code omitted } // end Driver Driver.java 12 new Creates an instance of a class Car myCar = new Car(); 13 Recap An object is an instance of class Use new to create an object Objects have data (instance variables) Objects offer functionality (methods) 14 There are two types of methods Methods that do not return a value (void) System.out.println("println does not return"); and methods that do return a value int num = keyboard.nextInt(); 15 Let's see how methods work First create the object Car myCar = new Car(); myCar bodyPaintColor null numberOfTires 0 Default values 16 You can then call a method to set an instance variable myCar.setNumberOfTires(4); Receiving Object myCar bodyPaintColor null numberOfTires 4 17 or a get method to retrieve an instance variable int tireCount = myCar.getNumberOfTires() 4 myCar bodyPaintColor null numberOfTires 4 18 this Demystified Since each method is shared by all the objects, we need to be able to identify the receiving object. this refers to the receiving object, implicitly. public int getNumberOfTires() { return this.numberOfTires; } // end getNumberOfTires() public void setNumberOfTires(int tireCount) { this.numberOfTires = tireCount; } // end setNumberOfTires() 19 void Method Definition Method is accessible by defining class and any other class Parameter list can be empty or list parameters needed public void setNumberOfTires(int tireCount) { numberOfTires = tireCount; } // end setNumberOfTires() Instance Variable 20 return Method Definition return type of int Parameter list can be empty or list parameters needed public int getNumberOfTires() { return numberOfTires; } // end getNumberOfTires() Instance Variable 21 Recap Methods expose a class's functionality Call a method on a receiving object identifies the receiving object inside the method's definition this Each class is stored in its own .java file 22 Local variables are defined within a method public double updateSumAmount(double amount) { double newSumAmount += amount; local variable return newSumAmount; } // end updateSumAmount() 23 Methods can define same name local variables public void method1() { double someDouble = 0; local to method1 // Code omitted } // end method1() public void method2() { double someDouble = 0; local to method2 // Code omitted } // end method2() 24 5.2 Information Hiding and Encapsulation 25 A method should hide how it is implemented I know what the method does, just not how! 26 Know "what" a method does, not "how" it does it 27 Methods can be public These define the class's interface 28 or private These are part of the implementation 29 Instance Variables are private They define the implementation 30 Accessor methods control access to instance variables Getters retrieve instance variables Setters set instance variables 31 Recap Local variables are defined within a method Know "what" a method does, not "how" it does it Public methods define the class's interface Private instance variables/methods are part of the implementation 32 Class Deconstructed <Fraction> Fraction - numerator: int - denominator: int - reduce(): void + + + + + + + + + + getNumerator(): int setNumerator(int n): void getDenominator(): int setDenominator(int d): void setNumeratorAndDenominator(int n, int d): void add(Fraction f): Fraction subtract(Fraction f): Fraction multiply(Fraction f): Fraction divide(Fraction f): Fraction show(): void 33 Application Deconstructed <Fraction.java> package fractiondemo; public class Fraction { private int numerator; private int denominator; private int int int void reduce() { u = numerator; v = denominator; temp; while (v != 0) { temp = u % v; u = v; v = temp; }// end while numerator /= u; denominator /= u; }// end reduce() 34 Application Deconstructed <Fraction.java> public int getNumerator() { return numerator; }// end getNumerator() public void setNumerator(int n) { setNumeratorAndDenominator(n, denominator); }// end setNumerator() public int getDenominator() { return denominator; }// end getDenominator() public void setDenominator(int d) { setNumeratorAndDenominator(numerator, d); }// end setDenominator() 35 Application Deconstructed <Fraction.java> public void setNumeratorAndDenominator(int n, int d) { numerator = n; if (d == 0) { System.err.println("ERROR: Invalid parameter (" + d + ") in setNumeratorAndDenonimator"); System.exit(1); } else { denominator = d; }// end if }// end setNumeratorAndDenominator() public Fraction add(Fraction f) { Fraction sum = new Fraction(); sum.setNumeratorAndDenominator(numerator * f.denominator + denominator * f.numerator, denominator * f.denominator); sum.reduce(); return sum; }// end add() 36 Application Deconstructed <Fraction.java> public Fraction subtract(Fraction f) { Fraction difference = new Fraction(); difference.setNumeratorAndDenominator( numerator * f.denominator denominator * f.numerator, denominator * f.denominator); difference.reduce(); return difference; }// end subtract() public Fraction multiply(Fraction f) { Fraction product = new Fraction(); product.setNumeratorAndDenominator( numerator * f.numerator, denominator * f.denominator); product.reduce(); return product; }// end multiply() 37 Application Deconstructed <Fraction.java> public Fraction divide(Fraction f) { Fraction division = new Fraction(); division.setNumeratorAndDenominator( numerator * f.denominator, denominator * f.numerator); division.reduce(); return division; }// end divide() public void show() { System.out.print("(" + numerator + " / " + denominator + ")"); }// end show() }// end Fraction() 38 Application Deconstructed <FractionDemo.java> package fractiondemo; public class FractionDemo { public static void main(String[] args) { Fraction f1 = new Fraction(); Fraction f2 = new Fraction(); Fraction result = new Fraction(); // Set f1 to 1 / 4. f1.setNumeratorAndDenominator(1, 4); // Set f2 to 1 / 2. f2.setNumeratorAndDenominator(1, 2); 39 Application Deconstructed <FractionDemo.java> // Output their sum, difference, product and division. result = f1.add(f2); f1.show(); System.out.print(" + "); f2.show(); System.out.print(" = "); result.show(); System.out.println(); result = f1.subtract(f2); f1.show(); System.out.print(" - "); f2.show(); System.out.print(" = "); result.show(); System.out.println(); 40 Application Deconstructed <FractionDemo.java> result = f1.multiply(f2); f1.show(); System.out.print(" * "); f2.show(); System.out.print(" = "); result.show(); System.out.println(); result = f1.divide(f2); f1.show(); System.out.print(" / "); f2.show(); System.out.print(" = "); result.show(); System.out.println(); }// end main() }// end FractionDemo 41 Application Deconstructed <FractionDemo.java> 42 5.3 Objects and References 43 There are two types of variables Value: 1 Stores the actual value 2 Reference: Stores a reference to the actual value 44 Value types store values int x = 100; x 100 45 Reference types store references Fraction f = new Fraction(); f 2040 . . . numerator ? denominator ? 2040 . . . 46 Lets compare value types int x = 100; x 100 int y = 200; y 200 x == y ? x = y; x == y ? false x 200 y 200 true 47 Now lets compare reference types Fraction f1 = new Fraction(); f1.setNumeratorAndDenominator(1,2); f1 200 numerator 1 200 denominator 2 Fraction f2 = new Fraction(); f2.setNumeratorAndDenominator(1,2); f2 208 numerator 1 208 denominator 2 f1 == f2 ? false f1 208 f1 = f2; f2 208 f1 == f2 ? numerator 1 208 denominator 2 true 48 The solution to the == problem? Define an equals method 49 Code Deconstructed <equals method> public boolean equals(Fraction f) { return this.numerator == f.numerator && this.denominator == f.denominator; }// end equals() Two fractions are equal if both their numerator and denominator values are the same. 50 Code Deconstructed <equals method> Fraction f1 = new Fraction(); f1.setNumeratorAndDenominator(1, 2); Fraction f2 = new Fraction(); f2.setNumeratorAndDenominator(1, 2); if (f1 == f2) System.out.println("Both variables refer to the same object"); else System.out.println("Each variable refers to a different object"); if ( f1.equals(f2) ) System.out.println("Both objects have the same value"); else System.out.println("Each object has a different value"); 51 Code Deconstructed <Object variables as parameters> Fraction f1 = new Fraction(); f1.setNumeratorAndDenominator(1,2); f1 200 numerator 1 200 denominator 2 Fraction f2 = new Fraction(); f2.setNumeratorAndDenominator(1,2); f2 208 numerator 1 208 denominator 2 if (f1.equals(f2) {...} ... public boolean equals(Fraction f) {...} f2 208 f 208 numerator 1 208 denominator 2 Both the argument (f2) and the parameter (f) point to the same object. Notice how the parameter (f) refers to the same object as the argument (f2) and thus object can be changed from within the method. 52 Code Deconstructed <Object variables as parameters> f1 200 numerator 1 200 denominator 2 resetFraction(f1); ... f1 200 numerator 1 200 denominator 2 public void resetFraction(Fraction f) f { f1 200 numerator 1 200 denominator 2 f numerator 1 208 denominator 1 Fraction f1 = new Fraction(); f1.setNumeratorAndDenominator(1,2); f = new Fraction(); f.setNumeratorAndDenominator(1, 1); } Notice here how the object variable (f) has been assigned a new object, and that f1 stills refers to its original object. 200 208 53 5.4 Graphic Supplement 54 Graphics class Revisited The Graphics object defines the client area of the applet window. 55 Applet Deconstructed <SmileyFaceMethods.java> package smileyfacemethods; import javax.swing.JApplet; import java.awt.Color; import java.awt.Graphics; public class SmileyFaceMethods extends JApplet { // All the geometric constants remain the same // ... 56 Applet Deconstructed <SmileyFaceMethods.java> @Override public void paint(Graphics canvas) { // Draw a yellow filled face. drawFace(canvas, X_FACE, Y_FACE, FACE_DIAMETER, FACE_DIAMETER, Color.YELLOW); // Draw outline in black. drawOutline(canvas, X_FACE, Y_FACE, FACE_DIAMETER, FACE_DIAMETER, Color.BLACK); 57 Applet Deconstructed <SmileyFaceMethods.java> // Draw a blue left eye. drawEye(canvas, X_LEFT_EYE, Y_LEFT_EYE, EYE_WIDTH, EYE_HEIGHT, Color.BLUE); // Draw a blue right eye. drawEye(canvas, X_RIGHT_EYE, Y_RIGHT_EYE, EYE_WIDTH, EYE_HEIGHT, Color.BLUE); 58 Applet Deconstructed <SmileyFaceMethods.java> // Draw the black nose. drawNose(canvas, X_NOSE, Y_NOSE, NOSE_DIAMETER, NOSE_DIAMETER, Color.BLACK); // Draw the red mouth. drawMouth(canvas, X_MOUTH, Y_MOUTH, MOUTH_WIDTH, MOUTH_HEIGHT, MOUTH_START_ANGLE, MOUTH_EXTENT_ANGLE, Color.RED); }// end paint() 59 Applet Deconstructed <SmileyFaceMethods.java> private void drawFace(Graphics g, int x, int y, int width, int height, Color color) { g.setColor(color); g.fillOval(x, y, width, height); }// end drawFace() private void drawOutline(Graphics g, int x, int y, int width, int height, Color color) { g.setColor(color); g.drawOval(x, y, width, height); }// end drawFace() 60 Applet Deconstructed <SmileyFaceMethods.java> private void drawEye(Graphics g, int x, int y, int width, int height, Color color) { g.setColor(color); g.fillOval(x, y, width, height); }// end drawEye() private void drawNose(Graphics g, int x, int y, int width, int height, Color color) { g.setColor(color); g.fillOval(x, y, width, height); }// end drawNose() 61 Applet Deconstructed <SmileyFaceMethods.java> private void drawMouth(Graphics g, int x, int y, int width, int height, int start, int swipe, Color color) { g.setColor(color); g.drawArc(x, y, width, height, start, swipe); }// end drawNose() }// end SmileyFaceMethods 62 Applet Deconstructed < SmileyFaceMethods.java > 63 init() Vs. paint() 64 Both have a place in Applets An applet could have both an init() and paint() or neither (unusual) Both get called automatically Paint() repaints controls as needed Init() initialization before applet starts 65 Code Deconstructed <Label> A label is a control for displaying static text in an applet or frame. Create and add the label in the init() method import javax.swing.JLabel; ... JLabel firstNameLabel = new JLabel("First name: "); JLabel lastNameLabel = new JLabel("Last name: "); 66 Code Deconstructed <Container> A Container is a control that can contain other controls The applet's ContentPane is one such container import java.awt.Container; ... Container contentPane = getContentPane(); 67 Code Deconstructed <FlowLayout> A FlowLayout control helps in laying out the controls in a container Each container can be associated with a FlowLayout. import java.awt.FlowLayout; ... contentPane.setLayout( new FlowLayout() ); contentPane.add(firstNameLabel); contentPane.add(lastNameLabel); 68 Application Deconstructed <LabelsDemo.java> package labelsdemo; import javax.swing.JLabel; import javax.swing.JFrame; import java.awt.Container; import java.awt.FlowLayout; public class LabelsDemo { public static void main(String[] args) { JFrame frame = new JFrame(); JLabel salutationLabel = new JLabel("Hello there,"); JLabel nameLabel = new JLabel("Mr. Magoo!"); Container contentPane = frame.getContentPane(); 69 Application Deconstructed <LabelsDemo.java> contentPane.setLayout( new FlowLayout() ); contentPane.add(salutationLabel); contentPane.add(nameLabel); frame.setSize(200, 100); frame.setVisible(true); } } 70 Application Deconstructed <LabelsDemo.java> 71 Application Deconstructed <LabelsAppletDemo.java> package labelsappletdemo; import import import import import javax.swing.JLabel; javax.swing.JApplet; java.awt.Container; java.awt.FlowLayout; java.awt.Graphics; public class LabelsAppletDemo extends JApplet { private void drawString(Graphics g, String string, int x, int y) { g.drawString(string, x, y); }// end drawString() 72 Application Deconstructed <LabelsAppletDemo.java> @Override public void init() { JLabel salutationLabel = new JLabel("Hello there,"); JLabel nameLabel = new JLabel("Mr Magoo!"); Container contentPane = getContentPane(); contentPane.setLayout( new FlowLayout() ); contentPane.add(salutationLabel); contentPane.add(nameLabel); }// end init() The init() method executes once before applet starts. It displays the two labels, but they do not remain visible for long. 73 Application Deconstructed <LabelsAppletDemo.java> @Override public void paint(Graphics g) { drawString(g, "Hello to you too!", 50, 100); }// end paint() }// end LabelsAppletDemo The paint() method is then executed and repaints the applet's content pane and draws the string. Notice how the labels never have a chance! 74