Object Oriented Programming in Java
Object Oriented Programming in Java
Programming in Java
Classes
A programming problem
• Given a file of cities' (x, y) coordinates,
which begins with the number of cities:
6
50 20
90 60
10 72
74 98
5 136
150 91
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
Classes and objects
• class: A program entity that represents either:
1. A program / module, or
2. A template for a new type of objects.
Blueprint analogy
iPod blueprint
state:
current song
volume
battery life
behavior:
power on/off
change station/song
change volume
choose random song
creates
6
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.
Our task
• In the following slides, we will implement a Point class as a
way of learning about defining classes.
8
Point objects (desired)
Point p1 = new Point(5, -2);
Point p2 = new Point(); // origin, (0, 0)
12
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
}
13
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
14
A class and its client
• Point.java is not, by itself, a runnable program.
– A class can be used by client programs.
15
16
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];
index 0 1 2 3 4
words value null null null null null
index 0 1 2
windows
value null null null
17
index 0 1 2 3 4
words
value "HELLO" null "GOODBYE" null null
20
Two-phase initialization
1) initialize the array itself (each element is initially null)
2) initialize each element of the array to be a new object
index 0 1 2 3
words
value "word0" "word1" "word2" "word3"
21
Bomb answer 1
import java.awt.*;
import java.io.*;
import java.util.*;
22
Bomb answer 2
// Reads input file of cities and returns them as array of Points.
public static Point[] readCities(Scanner 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!");
}
}
23
25
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);
}
26
Problem with static method
• We are missing a major benefit of objects: code reuse.
– Every program that draws Points would need a draw method.
Instance methods
• instance method (or object method): Exists inside each
object of a class and gives behavior to each object.
Example:
public void shout() {
System.out.println("HELLO THERE!");
}
28
Instance method example
public class Point {
int x;
int y;
// Draws this Point object with the given pen.
public void draw(Graphics g) {
...
}
}
29
p1.draw(g);
x 4 y 3
p2.draw(g); p2 public void draw(Graphics g) {
// this code can see p2's x and y
}
30
The implicit parameter
• implicit parameter:
The object on which an instance method is called.
31
– Each Point object contains a draw method that draws that point
at its current x/y position.
32
Kinds of methods
• accessor: A method that lets clients examine object state.
– Examples: distance, distanceFromOrigin
– often has a non-void return type
33
34
Mutator method answers
public void setLocation(int newX, int newY) {
x = newX;
y = newY;
}
35
36
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);
}
37
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)
38
The toString method
tells Java how to convert an object into a String
Point@9e8c34
39
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 + ")";
}
40
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
42
Constructors
• constructor: Initializes the state of new objects.
public type(parameters) {
statements;
}
Constructor example
public class Point {
int x;
int y;
...
}
44
Tracing a constructor call
• What happens when the following call is made?
Point p1 = new Point(7, 2);
p1 x y
45
47
Encapsulation
• encapsulation: Hiding implementation details from clients.
50
Private fields
A field that cannot be accessed from outside the class
– Examples:
private int id;
private String name;
52
Point class, version 4
// A Point object represents an (x, y) location.
public class Point {
private int x;
private int y;
public Point(int initialX, int initialY) {
x = initialX;
y = initialY;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public double distanceFromOrigin() {
return Math.sqrt(x * x + y * y);
}
public void setLocation(int newX, int newY) {
x = newX;
y = newY;
}
public void translate(int dx, int dy) {
setLocation(x + dx, y + dy);
}
}
53
Benefits of encapsulation
• Abstraction between object and clients
55
Variable shadowing
• shadowing: 2 variables with same name in same scope.
– Normally illegal, except when one variable is a field.
• Inside setLocation,
– To refer to the data field x, say this.x
– To refer to the parameter x, say x
57
public Point() {
this(0, 0); // calls (x, y) constructor
}
...
}
Multi-class systems
• Most large software systems consist of many classes.
– One main class runs and calls methods of the others.
• Advantages:
– code reuse
– splits up the program logic into manageable chunks
Main Class #1
main
method1
method2
Class #2 Class #3
method3 method4
method5 method6
60
Redundant program 1
// This program sees whether some interesting numbers are prime.
public class Primes1 {
public static void main(String[] args) {
int[] nums = {1234517, 859501, 53, 142};
for (int i = 0; i < nums.length; i++) {
if (isPrime(nums[i])) {
System.out.println(nums[i] + " is prime");
}
}
}
// Returns the number of factors of the given integer.
public static int countFactors(int number) {
int count = 0;
for (int i = 1; i <= number; i++) {
if (number % i == 0) {
count++; // i is a factor of the number
}
}
return count;
}
// Returns true if the given number is prime.
public static boolean isPrime(int number) {
return countFactors(number) == 2;
}
} 61
Redundant program 2
// This program prints all prime numbers up to a maximum.
public class Primes2 {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Max number? ");
int max = console.nextInt();
for (int i = 2; i <= max; i++) {
if (isPrime(i)) {
System.out.print(i + " ");
} }
System.out.println();
}
// Returns true if the given number is prime.
public static boolean isPrime(int number) {
return countFactors(number) == 2;
}
// Returns the number of factors of the given integer.
public static int countFactors(int number) {
int count = 0;
for (int i = 1; i <= number; i++) {
if (number % i == 0) {
count++; // i is a factor of the number
} }
return count;
}
62
}
Classes as modules
• module: A reusable piece of software, stored as a class.
– Example module classes: Math, Arrays, System
// This class is a module that contains useful methods
// related to factors and prime numbers.
public class Factors {
// Returns the number of factors of the given integer.
public static int countFactors(int number) {
int count = 0;
for (int i = 1; i <= number; i++) {
if (number % i == 0) {
count++; // i is a factor of the number
}
}
return count;
}
// Returns true if the given number is prime.
public static boolean isPrime(int number) {
return countFactors(number) == 2;
}
} 63
• Syntax:
class.method(parameters);
• Example:
int factorsOf24 = Factors.countFactors(24);
64
Using a module
// This program sees whether some interesting numbers are prime.
public class Primes {
public static void main(String[] args) {
int[] nums = {1234517, 859501, 53, 142};
for (int i = 0; i < nums.length; i++) {
if (Factors.isPrime(nums[i])) {
System.out.println(nums[i] + " is prime");
}
}
}
}
...
66
Static members
• static: Part of a class, rather than part of an object.
– Object classes can have static methods and fields.
– Not copied into each object; shared by all objects of that class.
class
state:
private static int staticFieldA
private static String staticFieldB
behavior:
public static void someStaticMethodC()
public static void someStaticMethodD()
Static fields
private static type name;
or,
private static type name = value;
– Example:
private static int theAnswer = 42;
68
Accessing static fields
• From inside the class where the field was declared:
fieldName // get the value
fieldName = value; // set the value
– generally static fields are not public unless they are final
BankAccount solution
public class BankAccount {
// static count of how many accounts are created
// (only one count shared for the whole class)
private static int objectCount = 0;
public BankAccount() {
objectCount++; // advance the id, and
id = objectCount; // give number to account
}
...
public int getID() { // return this account's id
return id;
}
}
70
Static methods
// the same syntax you've already used for
methods
public static type name(parameters) {
statements;
}
• Exercise: Make it so that clients can find out how many total
BankAccount objects have ever been created. 71
BankAccount solution
public class BankAccount {
// static count of how many accounts are created
// (only one count shared for the whole class)
private static int objectCount = 0;
// clients can call this to find out # accounts created
public static int getNumAccounts() {
return objectCount;
}
// fields (replicated for each object)
private String name;
private int id;
public BankAccount() {
objectCount++; // advance the id, and
id = objectCount; // give number to account
}
...
public int getID() { // return this account's id
return id;
}
}
72
Summary of Java classes
• A class is used for any of the following in a large program:
– a program : Has a main and perhaps other static methods.
• example: GuessingGame, Birthday, MadLibs, CritterMain
• does not usually declare any static fields (except final)