Why methods
Problem
One change, three places
You are writing the till program for a small shop. Every receipt starts with the shop's name and phone number, so you have copied those two lines everywhere a receipt is printed.
The shop changes its phone number. You fix it in two places and miss the third:
System.out.println("Corner Shop");System.out.println("tel. 02 123 4567");System.out.println("Bread €1.20");
System.out.println("Corner Shop");System.out.println("tel. 02 123 4567");System.out.println("Milk €2.10");
System.out.println("Corner Shop");System.out.println("tel. 02 765 4321");System.out.println("Coffee €3.50");Corner Shoptel. 02 123 4567Bread €1.20Corner Shoptel. 02 123 4567Milk €2.10Corner Shoptel. 02 765 4321Coffee €3.50The third customer gets a receipt with the old number. The more copies there are, the easier it is to miss one.
The idea
Write it once, call it by name
Put the repeated part in one place and give it a name. That is a method: a named block of code that does one job.
You write the method once. Then, wherever you need it, you write just its name with parentheses: printHeader();. This is called calling the method.
If the shop changes its phone number again, you fix one line in the method, and every receipt is right.
See it
What happens on a call
The program runs line by line. When it reaches a call, it goes into the method, runs its body and comes back to just after the call. Follow the ball: it is the point the program has reached.
static void printHeader() { System.out.println("Corner Shop"); System.out.println("tel. 02 123 4567");}
printHeader();System.out.println("Bread €1.20");printHeader();System.out.println("Milk €2.10");Step by step, in words
- The program starts in main and reaches printHeader().
- A call: execution goes into the method.
- The method prints the top of the receipt.
- The method is done: execution goes back to just after the call.
- main carries on: it prints the bread.
- A second call: the same code, without writing it again.
- The top is printed again.
- Back in main, on to the next line.
The second time, you do not write the top part again. You call the same method, and it prints the same two lines.
The idea
How to write a method
Here is the whole program, so you can see where the method goes:
public class Main { static void printHeader() { System.out.println("Corner Shop"); System.out.println("tel. 02 123 4567"); }
public static void main(String[] args) { printHeader(); System.out.println("Bread €1.20"); }}Corner Shoptel. 02 123 4567Bread €1.20- The name says what the method does, so it is a verb:
printHeader,printFooter. voidmeans the method only does something (here it prints) and returns no result. Methods that return a result come in the next lesson.- The empty parentheses mean the method takes nothing from outside. We will fill them in the next lesson too.
- The body is between
{and}. - The method sits in the class, next to main, not inside main.
For now we write static before every method. What it means comes in the Classes and objects module, along with the wrapper public class Main.
In Java, method names start with a lowercase letter, and every following word starts with a capital: printHeader, printFooter.
Try it
In what order?
What will the program print?
static void printThanks() { System.out.println("Thank you!");}
System.out.println("Order #1024");printThanks();System.out.println("Order #1025");printThanks();A method runs when it is called, not where it is written. Here it is called twice, so "Thank you!" is printed twice, each time after its order.
Try it
What is missing?
This method prints the bottom of the receipt. What goes in the blank?
static printFooter() {
System.out.println("We hope to see you again soon.");
}void: the method only prints and returns no result.Try it
Find the bug
Pick the line with the bug.
printThanks();. Without them the compiler sees only the name of the method, not a command to run it.Exercise
The receipt and the triangle
Solve these in your editor. Each one has sample output to compare yours with.
1. Receipt. Write three methods:
printLine()prints a line of 20 dashes with a loop;printHeader()prints the shop's name, the phone number and the line;printFooter()prints the line and "Thank you!".
In main, print two receipts: the top, one line with a purchase, the bottom.
Corner Shoptel. 02 123 4567--------------------Bread €1.20--------------------Thank you!Corner Shoptel. 02 123 4567--------------------Milk €2.10--------------------Thank you!2. Triangle. Write a method printTriangle() that uses nested loops to print a triangle of stars, 4 rows high:
* *** ************In the next lesson the height becomes a parameter: one method for a triangle of any height you like.
Test