480 likes | 559 Views
CMSC 150 Methods and Classes. CS 150: Wed 25 Jan 2012. Remember the length “method”?. String message = “Hello, Watson”; System.out.println ( message.length () ); // prints 13 Method – useful code packaged with a name In Java, methods belong to classes
E N D
CMSC 150Methods and Classes CS 150: Wed 25 Jan 2012
Remember the length “method”? String message = “Hello, Watson”; System.out.println( message.length() ); // prints 13 • Method – useful code packaged with a name • In Java, methods belong to classes • With an object like message, use the object variable to “call” the method • works on information inside the object message refers to
Why write a method? • Code can get very long and unwieldy • Methods let us break up code into logical chunks • Readability – with appropriately named methods, your code is easier to read and follow • Reuse – make repeated code into a method. Write once, use many times.
Why write a method? • Code can get very long and unwieldy • Methods let us break up code into logical chunks • Readability – with appropriately named methods, your code is easier to read and follow • Reuse – make repeated code into a method. Write once, use many times. MODULARITY
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later }
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } What “kind” of Method this is – More on this later.
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } Does this method produce a value, and if so, what type?
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } What name is used to “invoke” this method?
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } What information is expected from the caller in order to run this method? (Can be empty.)
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } The first line of a method is called the “method header” or “method signature”
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } What’s inside is called the “method body”
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } Statements executed when this method is called.
Writing methods public static <return-type> method-name ( parameters ) { statements; return <expression>; // Details later } If the method “returns a value,” this is how we make that happen.
Example: Back to FunBrain… Hmm… looks suspiciously like a method…
Example: Back to FunBrain… Check the guess against the secret number and generate a message to the user. Let’s make it into a method.
Parameter passing Formal parameter list
Parameter passing Actual parameter list
Parameter passing Can be any expression that evaluates to the type of the matching formal parameter.
What happens in memory? 25 userGuess … = checkGuess( userGuess, randomNumber, guesses ); 47 randomNumber 2 guesses … Memory used for variables in main()
What happens in memory? 25 userGuess … = checkGuess( userGuess, randomNumber, guesses ); public static String checkGuess ( intcurrentGuess, int secret, intnumGuesses ){ … 47 randomNumber 2 guesses Memory used for formal parameters in checkGuess … 25 currentGuess secret 47 numGuesses 2
What happens in memory? 25 userGuess … = checkGuess( userGuess, randomNumber, guesses ); public static String checkGuess ( intcurrentGuess, int secret, intnumGuesses ){ … 47 randomNumber 2 guesses When method call is made, values stored in the arguments… …are copied into the formal parameters … 25 currentGuess secret 47 numGuesses 2
What happens in memory? 25 userGuess … = checkGuess( userGuess, randomNumber, guesses ); public static String checkGuess ( intcurrentGuess, int secret, intnumGuesses ){ … 47 randomNumber 2 guesses Arguments & formal parameters initially have the same values… but occupy different spaces in memory … 25 currentGuess secret 47 numGuesses 2
Method facts • In Java, parameters are “passed by value” • (AKA “pass by copy”) • Each call to a method executes in its own memory space • Function: a method that creates and “returns” a value • Procedure: a method that only does work and returns no value (i.e., return type “void”)
Classes in Java • Classes contain two things: • methods (also called “behavior”) • data (also called “state”) • Encapsulate related data & methods • A good way of structuring large programs • e.g,. the Java libraries • String class • Random class • Scanner class
Example: String • What’s the data for a String object? • The sequence of characters it was initialized with • The length of the sequence • What behavior is available? • length() • charAt(intpos) • indexOf(char c) • substring(int begin, intpastEnd) • … it goes on and on …
Methods with different jobs • Some methods let you request information from the class • “Accessor” methods • names often start with “get” (but not always) • e.g., charAt method in String class • Some methods cause a change to the state (i.e., data) held by the class • “Mutator” methods • names may start with “set” (but not always) • e.g., setSeed method in Random class
In order to use a class… • … need to know what methods it provides • … need to know what parameters they expect • … need to know how the methods behave • … don’t need to know how they were written • Application Programming Interface (API) • Again, need a variable of that class type • Use that variable to call methods in the class
Lab setup • What you are given: • GameBoard Class • Room Class • Ghostbusters skeleton • API documentation for GameBoard and Room • What you will write: • Several methods in Ghostbusters needed by GameBoard to run the game • Your methods will use methods from GameBoard and Room
Your methods • public void setupGame() • Sets up the initial game configuration (similar to Wumpus) • public booleanhandleMove( String direction ) • Logic to control Ghostbuster moving from room to room • public void handleFire( String direction ) • Logic to control Ghostbuster firing proton pack @ Slimer • public booleancheckForLoss() • Determine if the Ghostbuster encountered Slimer or a portal • public void checkForGhostTrap() • Determine if the Ghostbuster found a desirable ghost trap
Ghostbusters: Two Classes Provided public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCow(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(int row, int col) … } public class Room { … public booleancontainsSlimer() public booleancontainsPortal() public booleancontainsGhostTrap() public void showPlayerEnters() public void showPlayerExits() public void addSlimer() public void showSlimer() public void addPortal() public void showPortal() public void addGhostTrap() public void removeGhostTrap() public void showGhostTrap() public void showPlayerSlimed() public void showSlimerCaptured() … }
GameBoard public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCol(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(introw,int col) … }
GameBoard public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCol(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(introw,int col) … } Keeps track of certain data related to the game, but you cannot assign these values directly. You must use methods provided by the class.
GameBoard public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCol(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(introw,int col) … } Keeps track of certain data related to the game, but you cannot assign these values directly. You must use methods provided by the class.
GameBoard public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCol(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(introw,int col) … } Keeps track of certain data related to the game, but you cannot assign these values directly. You must use methods provided by the class.
GameBoard To change anything with respect to the GameBoard, your program must have a variable of type GameBoard: GameBoard game = GameBoard.getGame(); public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCol(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(introw,int col) … }
GameBoard Then you can use that variable to call methods within the GameBoard class: game.setPlayerRow( randomRow ); game.setPlayerCol( randomCol ); inttheScore = game.getScore(); public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerCol(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom(introw,int col) … }
Room public class Room { … public booleancontainsSlimer() public booleancontainsPortal() public booleancontainsGhostTrap() public void showPlayerEnters() public void showPlayerExits() public void addSlimer() public void showSlimer() public void addPortal() public void showPortal() public void addGhostTrap() public void removeGhostTrap() public void showGhostTrap() public void showPlayerSlimed() public void showSlimerCaptured() … }
Room public class Room { … public booleancontainsSlimer() public booleancontainsPortal() public booleancontainsGhostTrap() public void showPlayerEnters() public void showPlayerExits() public void addSlimer() public void showSlimer() public void addPortal() public void showPortal() public void addGhostTrap() public void removeGhostTrap() public void showGhostTrap() public void showPlayerSlimed() public void showSlimerCaptured() … }
Room public class Room { … public booleancontainsSlimer() public booleancontainsPortal() public booleancontainsGhostTrap() public void showPlayerEnters() public void showPlayerExits() public void addSlimer() public void showSlimer() public void addPortal() public void showPortal() public void addGhostTrap() public void removeGhostTrap() public void showGhostTrap() public void showPlayerSlimed() public void showSlimerCaptured() … } To change anything with respect to a particular room, you must have a variable of the Room type. You get at a particular room via the GameBoard. GameBoard game = GameBoard.getGame(); Room firstRoom = game.getRoom(0,0);//
Room public class Room { … public booleancontainsSlimer() public booleancontainsPortal() public booleancontainsGhostTrap() public void showPlayerEnters() public void showPlayerExits() public void addSlimer() public void showSlimer() public void addPortal() public void showPortal() public void addGhostTrap() public void removeGhostTrap() public void showGhostTrap() public void showPlayerSlimed() public void showSlimerCaptured() … } Then you can use that Room variable to call methods within the Room class: firstRoom.addPortal();;firstRoom.showPortal(); if (firstRoom.containsPortal()) …
Ghostbusters public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerRow(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom() … } public class Ghostbusters { … public void setupGame() public booleanhandleMove(String dir) public void handleFire(String dir) public booleancheckForLoss() public void checkForGhostTrap() … } Your setupGame() method is called by the GameBoard class when the game is first started.
Ghostbusters public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerRow(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom() … } public class Ghostbusters { … public void setupGame() public booleanhandleMove(String dir) public void handleFire(String dir) public booleancheckForLoss() public void checkForGhostTrap() … } And your method is responsible for putting things onto the game board appropriately…
Ghostbusters public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerRow(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom() … } public class Ghostbusters { … public void setupGame() public booleanhandleMove(String dir) public void handleFire(String dir) public booleancheckForLoss() public void checkForGhostTrap() … } Your handleMove(…) method is called by the GameBoard class whenever the user clicks an arrow button to move
Ghostbusters public class GameBoard { … intplayerRow; intplayerCol; int score; Room[][] gridOfRooms; public GameBoardgetGame() public void setPlayerRow(int row) public void setPlayerRow(int col) public intgetPlayerRow() public intgetPlayerCol() public intgetScore() public void updateScore(int score) public void updateMessage(String m) public Room getRoom() … } public class Ghostbusters { … public void setupGame() public booleanhandleMove(String dir) public void handleFire(String dir) public booleancheckForLoss() public void checkForGhostTrap() … } Your handleFire(…) method is called by the GameBoard class whenever the user clicks a red arrow button to fire
Ghostbusters public class Ghostbusters { … public void setupGame() public booleanhandleMove(String dir) public void handleFire(String dir) public booleancheckForLoss() public void checkForGhostTrap() … } Your checkForLoss() and checkForGhostTrap() methods are called by your own handleMove(…) method