User-defined Java Classes

advertisement
Components of a Class
Data declarations
int size, weight;
char category;
Objects and Classes
Method declarations
A class can contain data declarations and method declarations
The values of the data define
the state of an object created from the class
The functionality of the methods define the behaviors of the object
C-1
5.1 – Identifying Classes (& Objects)
5.1 – Identifying Classes (& Objects)
 A class represents a group of objects with the same behaviors
 We want to define classes with the proper amount of detail
 Generally, classes that represent objects should be given names that are singular nouns. Examples: Coin, Student, Message
 Sometimes it is challenging to decide whether something should be represented 
It may be unnecessary to create separate classes for each type of appliance in a house

It may be sufficient to define a more general Appliance class with appropriate instance data

It all depends on the details of the problem being solved
 Part of identifying the classes we need as a class

C-2
is the process of assigning responsibilities to each class
Should an employee's address be represented as a set of instance variables or as an Address object?
 Every activity that a program must accomplish must be represented by one or more methods in one or more classes
 The more you examine the problem and its details  We generally use verbs for the names of methods
the more clear these issues become
 In early stages it is not necessary to determine every method of every class:  When a class becomes too complex, begin with primary responsibilities and evolve the design
it often should be decomposed into multiple smaller classes to distribute the responsibilities
C-3
C-4
// SnakeEyes.java Demonstrates the use of a programmer-defined class.
//********************************************************************
public class SnakeEyes
{
// Creates two Die objects and rolls 500 times,
//
counting the number of snake eyes (•)-(•) that occur.
//----------------------------------------------------------------public static void main (String[] args) {
final int ROLLS = 500;
int num1, num2, count = 0;
5.2 – Anatomy of a Class
5.2 – SnakeEyes.java
 Consider a six‐sided die (singular of dice)

Its state can be defined as which face is showing

Its primary behavior is that it can be rolled
Die die1 = new Die();
Die die2 = new Die();
for (int roll=1; roll <= ROLLS; roll++)
{
num1 = die1.roll();
num2 = die2.roll();
 We can represent a die in Java by designing a class called Die that models this state and behavior
 We want to design the Die class with other data and methods to make it a versatile and reusable resource
 Any given program will not necessarily use all aspects of a given class
if (num1 == 1 && num2 == 1)
count++;
 Let’s see how we would use someone’s class of the Die to play snakeEyes
die1
faceValue
5
die2
faceValue
2
// check for snake eyes
}
System.out.println ("Number of rolls: " + ROLLS);
System.out.println ("Number of snake eyes: " + count);
System.out.println ("Ratio: " + (float) count / ROLLS);
}
}
C-5
C-6
//********************************************************************
// Die.java
Java Foundations
// Represents one die with faces showing values between 1 and 6.
//********************************************************************
public class Die
{
private final int MAX = 6; // maximum face value
// Face value mutator.
// If the specified value is not valid face value does not change
//----------------------------------------------------------------public void setFaceValue (int value)
{
if (value > 0 && value <= MAX)
faceValue = value;
}
//----------------------------------------------------------------// Face value accessor.
//----------------------------------------------------------------public int getFaceValue()
{
return faceValue;
}
5.2 – Die.java
5.2 – Die.java
private int faceValue; // current value showing on the die
// Constructor: Sets the initial face value of this die.
//----------------------------------------------------------------public Die()
{
faceValue = 1;
}
//----------------------------------------------------------------// Returns a string representation of this die.
//----------------------------------------------------------------public String toString()
{
String result = Integer.toString(faceValue);
return result;
}
// Computes a new face value for this die and returns the result.
//----------------------------------------------------------------public int roll()
{
faceValue = (int)(Math.random() * MAX) + 1;
return faceValue;
}
}
(more…)
C-7
C-8
Reusing Classes, e.g. a Coin.java
CountFlips.java uses Coin.java
// Coin.java
Java Foundations
// Represents a coin with two sides that can be flipped.
//********************************************************************
public class Coin
{
… // private instance variables, no need to know them
// CountFlips.java
One program that uses Coin
public class CountFlips {
// Flips a coin multiple times and counts the number of heads & tails.
public static void main (String[] args) {
final int FLIPS = 1000;
int heads = 0, tails = 0;
public Coin () {// Constructor creates a new Coin.
… }
Coin myCoin = new Coin();
public void flip () {// Flips this coin.
… }
for (int count=1; count <= FLIPS; count++)
myCoin.flip();
// Returns true if the current face of this coin is heads.
public boolean isHeads () {
… }
{
if (myCoin.isHeads()) heads++;
else tails++;
}
System.out.println ("Number of flips: " + FLIPS);
System.out.println ("Number of heads: " + heads);
System.out.println ("Number of tails: " + tails);
// Returns the current face of this coin as a string.
public String toString() {
… }
}
}
}
C-9
5.3 – Encapsulation
FlipRace.java also uses Coin.java
// FlipRace.java
C-10
Another program that uses Coin
public class FlipRace {
// Flips two coins until one of them comes up heads 3 times in a row.
public static void main (String[] args) {
final int GOAL = 3;
int count1 = 0, count2 = 0;
Coin coin1 = new Coin(), coin2 = new Coin();
while (count1 < GOAL && count2 < GOAL)
{
coin1.flip();
coin2.flip();
System.out.println ("Coin 1: " + coin1 + "\tCoin 2: " + coin2);
// Increment or reset the counters
count1 = (coin1.isHeads()) ? count1 + 1 : 0;
count2 = (coin2.isHeads()) ? count2 + 1 : 0;
}
if (count1 < GOAL) System.out.println ("Coin 2 Wins!");
else
if (count2 < GOAL) System.out.println ("Coin 1 Wins!");
else System.out.println ("It's a TIE!");
}
}
 An encapsulated object can be thought of as a black box –
its inner workings are hidden from the client
 The client invokes the interface methods of the object, which manages the instance data
Client
Methods
Data
C-11
C-12
5.3 – Visibility Modifiers
5.4 – Method Control Flow
 If the called method is in the same class, only the method name is needed
 The called method is often part of another class or object
 Understanding the control flow is essential to debug!
 Java does encapsulation through the use of visibility modifiers
 A modifier specifies particular characteristics of a method or data
 Java has three visibility modifiers: public, protected, and private
 The protected modifier involves inheritance (later on this)
public
Variables
Methods
main
doIt
helpMe
private
Violate
encapsulation
Enforce
encapsulation
Provide services
to clients
Support other
methods in the
class
obj.doIt();
helpMe();
C-13
C-14
5.4 – Driver Programs
Constructors have no return type
 A driver program drives the use of other, more interesting parts of a  Note that a constructor has no return type in the method header, not even void
program
 A common error is to put a return type on a constructor,  A TestCoin class could contain a main method which makes it a “regular” method that happens to have the same name as the class
that drives the use of the Coin class, exercising its methods
 The programmer does not have to define a constructor for a class:
Each class has a default constructor that accepts no parameters
 I recommend to have a driver inside the class definition
 Constructors are often overloaded. as the class’ main() method.
That way the testing becomes part of the development.
 In any case, you should be able to write the driver/main()
before writing the class itself! C-15
C-16
Static Methods
Grade Class
class Helper {
public static int cube (int num) {
return num * num * num;
}
}
Write a Grade class that contains the following one constructor, three instance methods, and one class method:
// Constructor
public Grade(String letterGrade, double numericalGrade);
Because it is declared as static, the method can be invoked as
value = Helper.cube(5);
// Returns the score associated with this Grade
public double getScore();
 static associates the method (or var.) with the class
rather than with an instance of that class (that’s why they are also called class methods or class vars)
// Returns true if this Grade is higher than Grade g
public boolean isHigherThan(Grade g);
 For example, the methods of the Math class are static:
// Returns a String representation of this grade
public String toString();
result = Math.sqrt(25)
 Determining if a method or variable should be static // Returns the maximum of the two Grade objects
public static Grade max(Grade g1, Grade g2);
is an important design decision
C-17
Grade Class
For example, suppose the Grade class contained the following main method. // Main method… the Bronte sisters’ grades in CS230
public static void main(String[] args) {
Grade charlotte = new Grade(“B-”, 82.1);
Grade emily = new Grade(“A”, 94.5);
Grade anne = new Grade(“C+”, 79.0);
System.out.println(charlotte.isHigherThan(emily));
System.out.println(Grade.max(charlotte,anne).toString());
}
Then executing the Grade application would produce the following output: false
Letter grade:
Score:
B82.1
C-19
C-18
Download