Chapter

advertisement
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
Download