You are currently viewing Methods
java_logo

Methods

Methods are an essential part of Java programming, allowing you to encapsulate reusable blocks of code that perform specific tasks. Understanding how to write methods effectively is crucial for building well-structured and maintainable Java applications. In this guide, we’ll explore the anatomy of a method declaration in Java, discussing each component and its significance.

Let’s break down the structure of a method declaration in Java and understand each part:

public final void methodName(int arg1, String arg2) throws Exception {
    // Method body
}

Here’s a table summarizing the parts of a method declaration in Java:

ElementExample ValueRequired
Access ModifierpublicNo
Optional SpecifiersfinalNo
Return TypevoidNo
Method NamemethodNameYes
Parameter List(int arg1, String arg2)No
Exception Listthrows ExceptionNo
Method Body{ /* method body */ }Yes

Let’s start by taking a look at each of these parts of a basic method.

1. Acces modifiers

Access modifiers in Java determine the visibility or accessibility of classes, fields, methods, and other members within a program. There are four access modifiers:

  1. Private
  2. Default (Package-Private)
  3. Protected
  4. Public

Let’s delve into each of them:

1.1. Private Access Modifier

  • Members marked as private are accessible only within the same class.
  • They are not visible to subclasses or other classes in the same package.
  • This is the most restrictive access level.

1.2. Default (Package-Private) Access Modifier

  • When no access modifier is specified, it’s considered default (also known as package-private).
  • Members with default access are accessible only within the same package.
  • They are not visible outside of their package, even to subclasses.

1.3. Protected Access Modifier

  • Members marked as protected are accessible within the same package and by subclasses, even if they are in a different package.
  • They are not accessible to unrelated classes outside the package unless they are subclasses.

1.4. Public Access Modifier

  • Members marked as public are accessible from any other class.
  • They have the widest scope of accessibility, allowing them to be accessed from any package, including subclasses and unrelated classes.
package com.example;

public class PublicClass {
    private int privateField;
    int defaultField; // default access within the package
    protected int protectedField; // Accessible to subclasses
    public int publicField; // Accessible to all classes

    public void publicMethod() {
        // Method implementation
    }

    protected void protectedMethod() {
        // Method implementation
    }

    void defaultMethod() {
        // Method implementation
    }

    private void privateMethod() {
        // Method implementation
    }
}

2. Optional Specifiers

In addition to access modifiers, Java provides optional specifiers that further define the behavior of classes, fields, and methods. These specifiers include:

  1. Static
  2. Abstract
  3. Final
  4. Synchronized

2.1. Static

  • The static keyword is used to create class-level members that belong to the class itself rather than instances of the class.
  • Static members are shared across all instances of the class.
  • They can be accessed using the class name, without the need to create an object.
  • Commonly used for constants, utility methods, and variables that should not be duplicated across instances.

2.2. Abstract

  • The abstract keyword is used to define abstract classes and methods.
  • Abstract classes cannot be instantiated and may contain abstract methods that are defined without implementation.

2.3. Final

  • The final keyword is used to restrict the modification of classes, methods, and variables.
  • A final class cannot be subclassed, a final method cannot be overridden, and a final variable cannot be reassigned.
  • It indicates that the element cannot be changed or further extended.

2.4. Synchronized

  • The synchronized keyword is used to control access to critical sections of code by allowing only one thread to execute the synchronized block at a time.
  • It ensures thread safety by preventing concurrent access to shared resources.
  • Commonly used in multithreaded environments to prevent race conditions.

3. Return Type

The return type in Java specifies the type of data that a method can return. It defines the type of value that the method computes and sends back to the caller. Here are the key points about return types:

  • Data Type: The return type can be any valid Java data type, such as int, double, String, or even a custom class type.
  • Void: If a method does not return any value, its return type is specified as void.
  • Assignability: The value returned by the method must be assignable to the return type. For example, if a method returns an int, the value returned must be an int or an expression that evaluates to an int.
public class ReturnTypeExample {
    // Method with return type int
    public int add(int a, int b) {
        return a + b; // Returns an int value
    }

    // Method with return type String
    public String greet(String name) {
        return "Hello, " + name; // Returns a String value
    }

    // Method with return type void (no return value)
    public void printMessage() {
        System.out.println("This is a message."); // No return value
    }

    // Method with return type String (incorrect)
    public String divideAsString(int a, int b) {
        return a / b; // Compilation error: Incompatible types
    }
}

4. Method Name

Method names follow similar rules to variable names. Here are the key points about method names:

  • Characters: Method names can only contain letters (a-z, A-Z), digits (0-9), dollar signs ($), or underscores (_).
  • First Character: The first character of a method name cannot be a digit.
  • Reserved Words: Method names cannot be the same as Java keywords or reserved words.
  • Underscore: While method names can contain underscores, using a single underscore (_) as the method name is not allowed.

Let’s illustrate these points with examples:

public class MethodNameExample {
    // Valid method name containing only letters
    public void doSomething() {
        // Method implementation
    }

    // Method name with letters and digits
    public void calculateSum2() {
        // Method implementation
    }

    // Method name with underscores
    public void print_message() {
        // Method implementation
    }

    // Method name with a dollar sign
    public void process$Data() {
        // Method implementation
    }

    // Method name starting with an underscore
    public void _privateMethod() {
        // Method implementation
    }

    // invalid Method name starting with a digit (invalid)
    public void 2doSomething() {
        // Method implementation
    }

    // invalid Method name with a reserved word (invalid)
    public void class() {
        // Method implementation
    }

    // invalid Method name with a single underscore (invalid)
    public void _() {
        // Method implementation
    }
}

5. Parameter List

The parameter list in methods is a required component but can be empty. Here are the key points about parameter lists:

  • Parameter Types: Parameters in the list are comma-separated and must include the parameter’s type followed by its name.
  • No Parameters: If a method does not require any parameters, an empty parameter list is used.
public class ParameterListExample {
    // Method with parameters (int and String)
    public void greetUser(int age, String name) {
        System.out.println("Hello, " + name + "! You are " + age + " years old.");
    }

    // Method with an empty parameter list
    public void printMessage() {
        System.out.println("This is an empty parameter list method.");
    }
}

In the ParameterListExample class above:

  • The greetUser method takes two parameters: an integer age and a String name.
  • The printMessage method has an empty parameter list.

varargs

In Java, varargs (variable arguments) allow methods to accept a variable number of arguments of the same type. Here are the key points about varargs:

  • Last Parameter: Varargs must be the last parameter in a method’s parameter list.
  • Single Varargs: Each method can have only one varargs parameter.
  • Array-like Usage: Inside the method, varargs are treated as if they were an array of the specified type.
  • Passing Arguments: When calling a method with a varargs parameter, you can either pass an array of the parameter type or list the elements directly.
  • Automatic Array Creation: If you list the elements directly when calling the method, Java automatically creates an array for you.
  • Optional Values: You can even omit the varargs values in the method call, and Java treats the varargs parameter as an empty array.
public class VarargsExample {
    // Method with a parameter and a varargs parameter
    public static void printDetails(String prefix, int... numbers) {
        System.out.println("Prefix: " + prefix);
        System.out.println("Numbers:");
        for (int number : numbers) {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        // Calling the method with a parameter and varargs values
        printDetails("Values:", 1, 2, 3);

        // Calling the method with only a parameter (no varargs values)
        printDetails("Empty:");

        // Calling the method with an array
        int[] data = {10, 20, 30};
        printDetails("Data:", data);

        // Calling the method with a parameter and varargs using array notation
        printDetails("Array Notation:", new int[]{4, 5, 6});
    }
}

In the VarargsExample class above:

  • The printDetails method takes a String parameter prefix, followed by a varargs parameter of type int.
  • In the main method:
    • We call printDetails with a parameter "Values:" and varargs values 1, 2, and 3.
    • We call printDetails with only a parameter "Empty:", showing that the method can be called without varargs values.
    • We call printDetails with a parameter "Data:" and an array of int values 10, 20, and 30.
    • We call printDetails with a parameter "Array Notation:" and varargs values 4, 5, and 6, using array notation.

Let’s compare a method with and without varargs:

public class VarargsExample {
    // Method without varargs
    public static void printNumbers(String prefix, int number1, int number2, int number3) {
        System.out.println(prefix + " " + number1 + ", " + number2 + ", " + number3);
    }

    // Method with varargs
    public static void printNumbersVarargs(String prefix, int... numbers) {
        System.out.print(prefix);
        for (int number : numbers) {
            System.out.print(" " + number);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // Calling the method without varargs
        printNumbers("Numbers:", 1, 2, 3);

        // Calling the method with varargs
        printNumbersVarargs("Numbers:", 1, 2, 3);
    }
}
  • The printNumbers method takes a String parameter prefix, followed by three individual int parameters.
  • The printNumbersVarargs method takes a String parameter prefix, followed by a varargs parameter of type int.
  • In the main method:
    • We call printNumbers with a parameter "Numbers:" and three individual int values 1, 2, and 3.
    • We call printNumbersVarargs with a parameter "Numbers:" and varargs values 1, 2, and 3.

6. Exception List

In Java, the exception list in methods allows you to declare the exceptions that a method might throw during its execution. Here are the key points about exception lists:

  • Optional Component: The exception list is optional in method declarations.
  • Multiple Exceptions: You can specify multiple exceptions that a method might throw, separated by commas.
  • Checked and Unchecked Exceptions: Both checked and unchecked exceptions can be listed in the exception list.
  • Declaring Checked Exceptions: If a method might throw a checked exception, it must declare it in the exception list.
  • Unchecked Exceptions: Methods are not required to declare unchecked exceptions in the exception list, but they can do so if necessary.

Let’s illustrate these points with an example:

import java.io.IOException;

public class ExceptionListExample {
    // Method with a declared checked exception
    public void readFile() throws IOException {
        // Code to read a file
    }

    // Method with declared checked exceptions separated by commas
    public void processInput() throws IOException, IllegalArgumentException {
        // Code to process input data
    }

    // Method with no declared exceptions
    public void doSomething() {
        // Code that might throw unchecked exceptions
    }
}