Introducing Methods

 

A method is a collection of statements that are grouped together to perform an operation.

 

 

 

 

 

 

 

 

 

 

 

 

 

         Method signature is the combination of the method name and the parameter list.

 

         The variables defined in the method header are known as formal parameters.

 

         When a method is invoked, you pass a value to the parameter. This value is referred to as actual parameter or argument.

 

         A method may return a value. The returnValueType is the data type of the value the method returns. If the method does not return a value, the returnValueType is the keyword void. For example, the returnValueType in the main method is void.

 

 

Calling Methods

 

 

 

 

 

 

 

 

 

 

 

 


CAUTION

A return statement is required for a nonvoid method. The following method is logically correct, but it has a compilation error, because the Java compiler thinks it possible that this method does not return any value.

 

 public static int sign(int n) {

   if (n > 0) return 1;

   else if (n == 0) return 0;

   else if (n < 0) return –1;

 }

To fix this problem, delete if (n<0) in the code.

 

 

 

Reuse Methods from Other Classes

 

NOTE: One of the benefits of methods is for reuse. The max method can be invoked from any class besides TestMax. If you create a new class Test, you can invoke the max method using ClassName.methodName (e.g., TestMax.max).

 

 

Call Stacks

 

 

 

 

 

 

 

 

 

 

 

 

 


Passing Parameters

 

public static void nPrintln(String message, int n) { 

  for (int i = 0; i < n; i++)

    System.out.println(message);

}

 

Suppose you invoke the method using

nPrintln(“Welcome to Java”, 5);

What is the output?

 

Suppose you invoke the method using

nPrintln(“Computer Science”, 15);

What is the output?

 

Pass by Value

 

 

 

 

 

 

 

 

 

 

 

 

 


Ambiguous Invocation

 

Sometimes there may be two or more possible matches for an invocation of a method, but the compiler cannot determine the most specific match. This is referred to as ambiguous invocation. Ambiguous invocation is a compilation error.

 

 

 

Case Study: Computing Taxes with Methods

 

Listing 3.1, “Computing Taxes,” uses if statements to check the filing status and computes the tax based on the filing status. Simplify Listing 3.1 using methods. Each filing status has six brackets.

The code for computing taxes is nearly same for each filing status except that each filing status has different bracket ranges. For example, the single filer status has six brackets [0, 6000], (6000, 27950], (27950, 67700], (67700, 141250], (141250, 307050], (307050, ¥), and the married file jointly status has six brackets [0, 12000], (12000, 46700], (46700, 112850], (112850, 171950], (171950, 307050], (307050, ¥).

 

The first bracket of each filing status is taxed at 10%, the second 15%, the third 27%, the fourth 30%, the fifth 35%, and the sixth 38.6%. So you can write a method with the brackets as arguments to compute the tax for the filing status. The signature of the method is:

 

 

 

 
 
 
For example, you can invoke computeTax(400000, 6000, 27950, 67700, 141250, 307050) to compute the tax for single filers with $400,000 of taxable income:
 
import javax.swing.JOptionPane;
 
public class ComputeTaxWithMethod {
  public static void main(String[] args) {
    // Prompt the user to enter filing status
    String statusString = JOptionPane.showInputDialog(
      "Enter the filing status:");
    int status = Integer.parseInt(statusString);
 
    // Prompt the user to enter taxable income
    String incomeString = JOptionPane.showInputDialog(
      "Enter the taxable income:");
    double income = Double.parseDouble(incomeString);
 
    // Display the result
    JOptionPane.showMessageDialog(null, "Tax is " +
      (int)(computeTax1(status, income) * 100) / 100.0);
  }
 
  public static double computeTax2(double income,
    int r1, int r2, int r3, int r4, int r5) {
    double tax = 0;
 
    if (income <= r1)
      tax = income * 0.10;
    else if (income <= r2)
      tax = r1 * 0.10 + (income - r1) * 0.15;
    else if (income <= r3)
      tax = r1 * 0.10 + (r2 - r1) * 0.15 + (income - r2) * 0.27;
    else if (income <= r4)
      tax = r1 * 0.10 + (r2 - r1) * 0.15 +
        (r3 - r2) * 0.27 + (income - r3) * 0.30;
    else if (income <= r5)
      tax = r1 * 0.10 + (r2 - r1) * 0.15 + (r3 - r2) * 0.27 +
        (r4 - r3) * 0.30 + (income - r4) * 0.35;
    else
      tax = r1 * 0.10 + (r2 - r1) * 0.15 + (r3 - r2) * 0.27 +
        (r4 - r3) * 0.30 + (r5 - r4) * 0.35 + (income - r5) * 0.386;
 
    return tax;
  }
 
  public static double computeTax1(int status, double income) {
    switch (status) {
      case 0: return
        computeTax2(income, 6000, 27950, 67700, 141250, 307050);
      case 1: return
        computeTax2(income, 12000, 46700, 112850, 171950, 307050);
      case 2: return
        computeTax2(income, 6000, 23350, 56425, 85975, 153525);
      case 3: return
        computeTax2(income, 10000, 37450, 96700, 156600, 307050);
      default: return 0;
    }
  }
}

Scope of Local Variables

A local variable: a variable defined inside a method.

Scope: the part of the program where the variable can be referenced.

The scope of a local variable starts from its declaration and continues to the end of the block that contains the variable. A local variable must be declared before it can be used.

 

A variable declared in the initial action part of a for loop header has its scope in the entire loop. But a variable declared inside a for loop body has its scope limited in the loop body from its declaration and to the end of the block that contains the variabl

 

 

 

 

 

 

 

 

 

 

 


More on scope

 

 

 

 

 

 

 

 

 

 

 

 


// Fine with no errors

public static void correctMethod() {

  int x = 1;

  int y = 1;

  // i is declared

  for (int i = 1; i < 10; i++) {

    x += i;

  }

  // i is declared again

  for (int i = 1; i < 10; i++) {

    y += i;

  }

}

// With an error

public static void incorrectMethod() {

  int x = 1;

  int y = 1;

  for (int i = 1; i < 10; i++) {

    int x = 0;

    x += i;

  }

}

 

 

Benefits of Methods

 

         Write a method once and reuse it anywhere.

         Information hiding. Hide the implementation from the user.

         Reduce complexity.

 

 

The Math Class

 

Class constants:

PI

E

Class methods:

       Trigonometric Methods

       Exponent Methods

       Rounding Methods

       min, max, abs, and random Methods

 

Trigonometric Methods

sin(double a)

cos(double a)

tan(double a)

acos(double a)

asin(double a)

atan(double a)

 

Examples:

Math.sin(0) returns 0.0

Math.sin(Math.PI / 6) returns 0.5

Math.sin(Math.PI / 2) returns 1.0

Math.cos(0) returns 1.0

Math.cos(Math.PI / 6) returns 0.866

Math.cos(Math.PI / 2) returns 0

 

 

Exponent Methods

exp(double a)

Returns e raised to the power of a.

log(double a)

Returns the natural logarithm of a.

log10(double a)

Returns the 10-based logarithm of a.

pow(double a, double b)

Returns a raised to the power of b.

sqrt(double a)

Returns the square root of a.

 

Examples:

Math.exp(1) returns 2.71

Math.log(2.71) returns 1.0

Math.pow(2, 3) returns 8.0

Math.pow(3, 2) returns 9.0

Math.pow(3.5, 2.5) returns 22.91765

Math.sqrt(4) returns 2.0

Math.sqrt(10.5) returns 3.24

 

 

Rounding Methods

double ceil(double x)

x rounded up to its nearest integer. This integer is  returned as a double value.

double floor(double x)

x is rounded down to its nearest integer. This integer is  returned as a double value.

double rint(double x)

x is rounded to its nearest integer. If x is equally close to two integers, the even one is returned as a double.

int round(float x)

Return (int)Math.floor(x+0.5).

long round(double x)

Return (long)Math.floor(x+0.5).

 

Rounding Methods Examples:

Math.ceil(2.1) returns 3.0

Math.ceil(2.0) returns 2.0

Math.ceil(-2.0) returns –2.0

Math.ceil(-2.1) returns -2.0

Math.floor(2.1) returns 2.0

Math.floor(2.0) returns 2.0

Math.floor(-2.0) returns –2.0

Math.floor(-2.1) returns -3.0

Math.rint(2.1) returns 2.0

Math.rint(2.0) returns 2.0

Math.rint(-2.0) returns –2.0

Math.rint(-2.1) returns -2.0

Math.rint(2.5) returns 2.0

Math.rint(-2.5) returns -2.0

Math.round(2.6f) returns 3

Math.round(2.0) returns 2  

Math.round(-2.0f) returns -2  

Math.round(-2.6) returns -3 

 

 

min, max, and abs

max(a, b)and min(a, b)

Returns the maximum or minimum of two parameters.

abs(a)

Returns the absolute value of the parameter.

random()

Returns a random double value
in the range [0.0, 1.0).

 

 

Examples:

Math.max(2, 3) returns 3

Math.max(2.5, 3) returns 3.0

Math.min(2.5, 3.6) returns 2.5

Math.abs(-2) returns 2

Math.abs(-2.1) returns 2.1

 

The random Method

Generates a random double value greater than or equal to 0.0 and less than 1.0 (0 <= Math.random() < 1.0).

 

Examples:

 

 

 

 

 

 

      In general: