Ch08A - Classes - O-O Programming, Object State and Behavior
Ch08A - Classes - O-O Programming, Object State and Behavior
Chapter 8
Classes
3
Observations
• The data in this problem is a set of points.
• It would be better stored as Point objects.
– A Point would store a city's x/y data.
4
Clients of objects
• client program: A program that uses objects.
– Example: Bomb is a client of DrawingPanel and Graphics.
DrawingPanel.java (class)
Bomb.java (client program)
public class DrawingPanel {
public class Bomb {
...
main(String[] args) {
}
new DrawingPanel(...)
new DrawingPanel(...)
...
}
}
5
Classes and objects
• class: A program entity that represents either:
1. A program / module, or
2. A template for a new type of objects.
6
Blueprint analogy
iPod blueprint
state:
current song
volume
battery life
behavior:
power on/off
change station/song
change volume
choose random song
create
s
iPod #1 iPod #2 iPod #3
state: state: state:
song = "1,000,000 song = "Letting You" song = "Discipline"
Miles" volume = 9 volume = 24
volume = 17 battery life = 3.41 battery life = 1.8
battery life = 2.5 hrs hrs
hrs behavior: behavior:
behavior: power on/off power on/off
power on/off change station/song change station/song
change station/song change volume change volume
change volume choose random choose random
choose random song song 7
song
Abstraction
• abstraction: A distancing between ideas and details.
– We can use objects without knowing how they work.
• abstraction in an iPod:
– You understand its external behavior (buttons, screen).
– You don't understand its inner details, and you don't need
to.
8
Our task
• In the following slides, we will implement a Point class
as a way of learning about defining classes.
9
Point objects (desired)
Point p1 = new Point(5, -2);
Point p2 = new Point(); // origin, (0, 0)
13
Fields
• field: A variable inside an object that is part of its
state.
– Each object has its own copy of each field.
• Declaration syntax:
type name;
– Example:
public class Student {
String name; // each Student object has a
double gpa; // name and gpa field
}
14
Accessing fields
• Other classes can access/modify an object's fields.
– access: variable.field
– modify: variable.field = value;
• Example:
Point p1 = new Point();
Point p2 = new Point();
System.out.println("the x-coord is " + p1.x); // access
p2.y = 13; // modify
15
A class and its client
• Point.java is not, by itself, a runnable program.
– A class can be used by client programs.
16
PointMain client example
public class PointMain {
public static void main(String[] args) {
// create two Point objects
Point p1 = new Point();
p1.y = 2;
Point p2 = new Point();
p2.x = 4;
System.out.println(p1.x + ", " + p1.y); // 0, 2
// move p2 and then print it
p2.x += 2;
p2.y++;
System.out.println(p2.x + ", " + p2.y); // 6, 1
}
}
17
Arrays of objects
• null : A value that does not refer to any object.
– The elements of an array of objects are initialized to null.
String[] words = new String[5];
DrawingPanel[] windows = new DrawingPanel[3];
inde 0 1 2 3 4
words x
valu nul nul nul nul nul
e l l l l l
inde 0 1 2
windows x
valu nul nul nul
e l l l
18
Things you can do w/
null
• store null in a variable or an array element
String s = null;
words[2] = null;
inde 0 1 2 3 4
Output: x
word is: null valu nul nul nul nul nul
Exception in thread "main" e l l l l l
java.lang.NullPointerException
at Example.main(Example.java:8)
20
Looking before you leap
• You can check for null before calling an object's
methods.
String[] words = new String[5];
words[0] = "hello";
words[2] = "goodbye"; // words[1], [3], [4] are null
inde 0 1 2 3
words x
valu "word0" "word1" "word2" "word3"
e
22
Bomb answer 1
import java.awt.*;
import java.io.*;
// import java.util.*; // not needed because using Scanner170
// Displays a set of cities and simulates dropping a "bomb" on them.
public class Bomb {
public static void main(String[] args) throws FileNotFoundException {
DrawingPanel panel = new DrawingPanel(200, 200);
Graphics g = panel.getGraphics();
Scanner170 input = new Scanner170(new File("cities.txt"));
Point[] cities = readCities(input, g);
// drop the "bomb"
Scanner170 console = new Scanner170(System.in);
Point bomb = new Point();
System.out.print("Blast site x? ");
bomb.x = console.nextInt();
System.out.print("Blast site y? ");
bomb.y = console.nextInt();
System.out.print("Blast radius? ");
int radius = console.nextInt();
boom(bomb, radius, cities, g);
}
...
23
Bomb answer 2
// Reads input file of cities and returns them as array of Points.
public static Point[] readCities(Scanner170 input, Graphics g) {
int numCities = input.nextInt(); // first line = # of cities
Point[] cities = new Point[numCities];
for (int i = 0; i < cities.length; i++) {
cities[i] = new Point();
cities[i].x = input.nextInt(); // read city x/y from file
cities[i].y = input.nextInt();
g.fillOval(cities[i].x, cities[i].y, 3, 3);
g.drawString("(" + cities[i].x + ", " + cities[i].y + ")",
cities[i].x, cities[i].y);
}
return cities;
}
// Simulates dropping a bomb at the given location on the given cities.
public static void boom(Point bomb, int radius, Point[] cities, Graphics g) {
g.setColor(Color.RED);
g.drawOval(bomb.x - radius, bomb.y - radius, 2 * radius, 2 * radius);
for (int i = 0; i < cities.length; i++) {
int dx = cities[i].x - bomb.x;
int dy = cities[i].y - bomb.y;
double distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= radius) {
g.fillOval(cities[i].x, cities[i].y, 3, 3);
g.drawString("(" + cities[i].x + ", " + cities[i].y + ")",
cities[i].x, cities[i].y);
}
}
System.out.println("Kaboom!");
}
}
24
Object behavior:
Methods
Client code redundancy
• Our client program wants to draw Point objects:
// draw each city
g.fillOval(cities[i].x, cities[i].y, 3, 3);
g.drawString("(" + cities[i].x + ", " + cities[i].y + ")",
cities[i].x, cities[i].y);
26
Eliminating redundancy,
v1
• We can eliminate the redundancy with a static method:
// Draws the given point on the DrawingPanel.
public static void draw(Point p, Graphics g) {
g.fillOval(p.x, p.y, 3, 3);
g.drawString("(" + p.x + ", " + p.y + ")", p.x, p.y);
}
27
Problem with static
method
• We are missing a major benefit of objects: code reuse.
– Every program that draws Points would need a draw
method.
Example:
public void shout() {
System.out.println("HELLO THERE!"); 29
Instance method
example
public class Point {
int x;
int y;
// Draws this Point object with the given pen.
public void draw(Graphics g) {
...
}
}
– The draw method no longer has a Point p parameter.
– How will the method know which point to draw?
• How will the method access that point's x/y data?
30
Point objects w/ method
• Each Point object has its own copy of the draw method,
which operates on that object's state:
p1
Point p1 = new Point();
p1.x = 7;
p1.y = 2;
x 7 y 2
Point p2 = new Point();
public void draw(Graphics g) {
p2.x = 4; // this code can see p1's x
p2.y = 3; and y
}
p1.draw(g);
p2.draw(g); x 4 y 3
p2
public void draw(Graphics g) {
// this code can see p2's x
and y
}
31
The implicit parameter
• implicit parameter:
The object on which an instance method is called.
– During the call p1.draw(g);
the object referred to by p1 is the implicit parameter.
32
Point class, version 2
public class Point {
int x;
int y;
// Changes the location of this Point object.
public void draw(Graphics g) {
g.fillOval(x, y, 3, 3);
g.drawString("(" + x + ", " + y + ")", x, y);
}
}
33
Kinds of methods
• accessor: A method that lets clients examine object
state.
– Examples: distance, distanceFromOrigin
– often has a non-void return type
34
Mutator method
questions
• Write a method setLocation that changes a Point's
location to the (x, y) values passed.
35
Mutator method answers
public void setLocation(int newX, int newY) {
x = newX;
y = newY;
}
36
Accessor method
questions
• Write a method distance that computes the distance
between a Point and another Point parameter.
37
Accessor method
answers
public double distance(Point other) {
int dx = x - other.x;
int dy = y - other.y;
return Math.sqrt(dx * dx + dy * dy);
}
38
Printing objects
• By default, Java doesn't know how to print objects:
Point p = new Point();
p.x = 10;
p.y = 7;
System.out.println("p is " + p); // p is Point@9e8c34
// desired behavior
System.out.println("p is " + p); // p is (10, 7)
39
The toString method
tells Java how to convert an object into a String
Point@9e8c34
40
toString syntax
public String toString() {
code that returns a String representing this
object;
}
– Example:
// Returns a String representing this Point.
public String toString() {
return "(" + x + ", " + y + ")";
}
41
Object initialization:
constructors
Initializing objects
• Currently it takes 3 lines to create a Point and initialize
it:
Point p = new Point();
p.x = 3;
p.y = 8; // tedious
43
Constructors
• constructor: Initializes the state of new objects.
public type(parameters) {
statements;
}
...
}
45
Tracing a constructor call
• What happens when the following call is made?
Point p1 = new Point(7, 2);
p1 x y
47
Multiple constructors
• A class can have multiple constructors.
– Each one must accept a unique set of parameters.
48
Common constructor
bugs
1. Re-declaring fields as local variables ("shadowing"):
public Point(int initialX, int initialY) {
int x = initialX;
int y = initialY;
}
– This declares local variables with the same name as the
fields, rather than storing values into the fields. The
fields remain 0.