Objects are building blocks of software systems
Program is collection of interacting objects
Objects cooperate to complete a task
Objects communicate by sending message to each other
Concepts (meeting, date)
Processes (Sorting, simulations)
Capabilities (drive, change speed, admit passenger)
Queries: Provide answer based on object's properties (e.g., how fast?)
affect how object reacts to messages
components (e.g., doors)
associations (e.g., driver)
new Card(Ace,Spades);May be used as basis for more refined classes
class PinochleCard extends CardContains info on all fields and method bodies, including non-public
public boolean equals(Object other) public int hashCode() public String toString()
Don't need to write these in interfaces, often "override" definitions in classes.
// A playing card interface. // Advertises all the public features of a card object. public interface CardInterface{ // "final" is what makes them constants // "static" shares one copy of the value over all objects // in class. I.e., all objects get access to same copy // Constants static final int CLUBS = 0; static final int DIAMONDS = 1; static final int HEARTS = 2; static final int SPADES = 3; // No need to start with 0 as first value; // they need not even be consecutive static final int TWO = 2; static final int THREE = 3; static final int FOUR = 4; static final int FIVE = 5; static final int SIX = 6; static final int SEVEN = 7; static final int EIGHT = 8; static final int NINE = 9; static final int TEN = 10; static final int JACK = 11; static final int QUEEN = 12; static final int KING = 13; static final int ACE = 14; // Methods int getSuit(); int getRank(); } //-------------------------------------------
// A playing card implementation public class Card implements CardInterface { // "protected" means other classes can't access them // (data hiding) // instance variables protected int suit; // The suit of card: CLUBS..SPADES protected int rank; // The rank of the card: TWO..ACE // Constructors // This version of the constructor does all of the work public Card(int theRank, int theSuit) // post: Constructs a card of the given type { suit = theSuit; rank = theRank; } // This constructor merely invokes the two-argument // constructor, using "this" syntax public Card() // post: Constructs card with value "Ace of Spades" { this(ACE,SPADES); } // Methods public boolean equals(Object other) // pre: other is a non-null CardInterface // post: returns true iff this equals other { CardInterface otherCard = (CardInterface) other; return (suit == otherCard.getSuit()) && (rank == otherCard.getRank()); } // Having this method allows Cards to be used in certain // data structures. For now, just try to return different // values for different cards. This returns a number in the // range 0..51; different cards yield different values public int hashCode() // post: returns hash code for this card { return 13*suit + rank - 2; } public int getSuit() // post: returns suit of card { return suit; } public int getRank() // post: returns rank of card { return rank; } // Java provides a String class with many useful methods // "switch" is Java's "case" statement // It must end each block with "break", or else next block // is also executed // The "default" block is optional protected String getSuitString() // post: returns a string representation of the suit { String suitStr = null; switch (suit) { case CLUBS: suitStr = "Clubs"; break; case DIAMONDS: suitStr = "Diamonds"; break; case HEARTS: suitStr = "Hearts"; break; case SPADES: suitStr = "Spades"; break; default: } return suitStr; } protected String getRankString() // post: returns a string representation of the rank { String rankStr = null; switch (rank) { case TWO: rankStr = "Two"; break; case THREE: rankStr = "Three"; break; case FOUR: rankStr = "Four"; break; case FIVE: rankStr = "Five"; break; case SIX: rankStr = "Six"; break; case SEVEN: rankStr = "Seven"; break; case EIGHT: rankStr = "Eight"; break; case NINE: rankStr = "Nine"; break; case TEN: rankStr = "Ten"; break; case JACK: rankStr = "Jack"; break; case QUEEN: rankStr = "Queen"; break; case KING: rankStr = "King"; break; case ACE: rankStr = "Ace"; break; default: } return rankStr; } // The toString method is special. // It allows for automatic printing of Objects // Note: + for String concatenation public String toString() // post: returns a string representation of this card { return getRankString() + " of " + getSuitString(); } // The toString method is special. // It allows for automatic printing of Objects // Note: + for String concatenation public String toString() // post: returns a string representation of this card { return getRankString() + " of " + getSuitString(); } // If a class contains a main method, // that method can be run when the class is compiled // I always have one, which I use for testing the class public static void main(String args[]) // Test Card class { // Create some cards CardInterface first = new Card(THREE,DIAMONDS); CardInterface second = new Card(); System.out.println(); System.out.println(first); System.out.println(second); System.out.println(); // Note: ! is the negation operator System.out.print("These cards are "); if(!first.equals(second)) System.out.print("not "); System.out.println("equal"); System.out.println(); // Create an array of cards // Note syntax for array declaration CardInterface[] hand = new CardInterface[5]; hand[0] = new Card(ACE,HEARTS); hand[1] = new Card(KING,HEARTS); hand[2] = new Card(QUEEN,HEARTS); hand[3] = new Card(JACK,HEARTS); hand[4] = new Card(TEN,HEARTS); // for loop // Note: declaration in for loop; // ++ is the "add 1" operator for(int i=0;i<4;i++) System.out.print(hand[i] + ", "); System.out.println(hand[4]); } }