Java 零基础教程

Java 方法与参数

方法(Methods)允许你将复杂的任务分解为更小、更易于管理的片段。而参数(Parameters)则极大地增强了方法的灵活性和可重用性,使方法能够在每次被调用时处理不同的数据。如果没有参数,方法就只能对相同的数据执行相同的操作,其实用性将大打折扣。

本章将深入探讨如何定义带有参数的方法,赋予你编写更通用、更高效的 Java 代码的能力。

1. 理解方法参数

参数是变量,用于接收在调用方法时传递给它的值。它们允许你将数据传入方法内部,从而使方法变得更加动态和可重用。一个方法可以没有参数,也可以有一个或多个参数。

1.1 形式参数与实际参数

在学习方法参数时,区分“形式参数”和“实际参数”非常重要:

  • 形式参数(Formal Parameters,简称形参):这些是在方法定义中声明的变量。它们充当占位符,等待接收传递给方法的值。
  • 实际参数(Actual Parameters / Arguments,简称实参):这些是在调用方法时实际传递给它的具体数值。实参的值会被赋值给对应的形参。

来看下面这个例子:

public class ParameterExample {
    // 方法定义,包含形式参数:int num1, int num2
    public static int add(int num1, int num2) {
        return num1 + num2;
    }

    public static void main(String[] args) {
        // 方法调用,传入实际参数:5, 10
        int sum = add(5, 10);
        System.out.println("总和是: " + sum); // 输出: 总和是: 15
    }
}

在这个例子中:

  • num1num2add 方法的形式参数。
  • 5 和 10 是在 main 方法中调用 add 方法时传递的实际参数(实参)

2. 声明带参数的方法

要定义一个带有参数的方法,你需要在方法声明的圆括号内指定每个参数的数据类型和名称。基本语法如下:

<访问修饰符> <返回类型> <方法名称>(<数据类型> <参数名称>, <数据类型> <参数名称>, ...) {
    // 方法体(要执行的代码)
}
  • <访问修饰符>: 指定方法的可见性(例如:publicprivateprotected)。
  • <返回类型>: 指定方法返回值的数据类型。如果方法不返回任何值,则使用 void。
  • <方法名称>: 方法的名字。
  • <数据类型> <参数名称>: 每个参数的数据类型和名称。如果有多个参数,请用逗号分隔。

示例 1:带有两个整数参数的方法

public class Example1 {
    public static int multiply(int a, int b) {
        return a * b;
    }

    public static void main(String[] args) {
        int result = multiply(7, 3);
        System.out.println("乘积是: " + result); // 输出: 乘积是: 21
    }
}

示例 2:带有一个字符串和一个整数参数的方法

public class Example2 {
    public static void printMessage(String message, int count) {
        for (int i = 0; i < count; i++) {
            System.out.println(message);
        }
    }

    public static void main(String[] args) {
        printMessage("你好,世界!", 3);
        // 输出:
        // 你好,世界!
        // 你好,世界!
        // 你好,世界!
    }
}

示例 3:带有多个不同数据类型参数的方法

public class Example3 {
    public static String createGreeting(String name, int age, String city) {
        return "你好,我的名字是 " + name + ",我今年 " + age + " 岁,我住在 " + city + "。";
    }

    public static void main(String[] args) {
        String greeting = createGreeting("爱丽丝", 30, "纽约");
        System.out.println(greeting); // 输出: 你好,我的名字是 爱丽丝,我今年 30 岁,我住在 纽约。
    }
}

3. 参数的数据类型

参数可以是任何有效的 Java 数据类型,包括:

  • 基本数据类型:intfloatdoublebooleancharbyteshortlong
  • 引用数据类型:String、数组、类的对象

示例 1:带有 double 参数的方法

public class Example4 {
    public static double calculateSquareRoot(double number) {
        return Math.sqrt(number);
    }

    public static void main(String[] args) {
        double result = calculateSquareRoot(25.0);
        System.out.println("平方根是: " + result); // 输出: 平方根是: 5.0
    }
}

示例 2:带有 boolean 参数的方法

public class Example5 {
    public static void checkEligibility(int age, boolean hasConsent) {
        if (age >= 18 || hasConsent) {
            System.out.println("符合资格");
        } else {
            System.out.println("不符合资格");
        }
    }

    public static void main(String[] args) {
        checkEligibility(16, true);  // 输出: 符合资格
        checkEligibility(16, false); // 输出: 不符合资格
        checkEligibility(20, false); // 输出: 符合资格
    }
}

示例 3:带有数组参数的方法

public class Example6 {
    public static int sumArray(int[] numbers) {
        int sum = 0;
        for (int number : numbers) {
            sum += number;
        }
        return sum;
    }

    public static void main(String[] args) {
        int[] myArray = {1, 2, 3, 4, 5};
        int result = sumArray(myArray);
        System.out.println("数组的总和是: " + result); // 输出: 数组的总和是: 15
    }
}

4. 向方法传递参数

当调用带有参数的方法时,你提供的实参必须与方法定义中形参的数量、类型和顺序完全匹配。

4.1 匹配参数类型

每个实参的数据类型必须与对应形参的数据类型兼容。在某些情况下,Java 会自动执行类型转换(向上转型/加宽转换),但通常最好确保实参类型与形参类型严格一致。

示例 1:隐式类型转换(自动转换)

public class Example7 {
    public static void printDouble(double number) {
        System.out.println("这个数字是: " + number);
    }

    public static void main(String[] args) {
        int num = 10;
        printDouble(num); // 隐式地将 int 转换为 double
        // 输出: 这个数字是: 10.0
    }
}

示例 2:显式类型转换(强制转换)

public class Example8 {
    public static int multiply(int a, int b) {
        return a * b;
    }

    public static void main(String[] args) {
        double x = 5.5;
        double y = 2.5;
        int result = multiply((int) x, (int) y); // 显式地将 double 强转为 int
        System.out.println("乘积是: " + result); // 输出: 乘积是: 10
    }
}

4.2 参数的顺序

方法调用时实参的顺序,必须与方法定义时形参的顺序一模一样。

正确的顺序示例

public class Example9 {
    public static String formatName(String firstName, String lastName) {
        return lastName + ", " + firstName;
    }

    public static void main(String[] args) {
        String formattedName = formatName("Alice", "Smith");
        System.out.println(formattedName); // 输出: Smith, Alice
    }
}

如果你把参数的顺序弄反了,输出结果就会出错(或者导致编译报错,如果数据类型不匹配的话):

错误的顺序示例

public class Example10 {
    public static String formatName(String firstName, String lastName) {
        return lastName + ", " + firstName;
    }

    public static void main(String[] args) {
        String formattedName = formatName("Smith", "Alice");
        System.out.println(formattedName); // 输出: Alice, Smith (这是不正确的)
    }
}

5. 综合实战演示

让我们看几个更具实用性的例子,来巩固你对定义带参数方法的理解。

示例 1:计算矩形的面积

public class RectangleArea {
    public static double calculateArea(double length, double width) {
        return length * width;
    }

    public static void main(String[] args) {
        double area = calculateArea(10.5, 5.0);
        System.out.println("矩形的面积是: " + area); // 输出: 矩形的面积是: 52.5
    }
}

示例 2:检查数字是否为偶数

public class EvenNumberChecker {
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }

    public static void main(String[] args) {
        boolean even1 = isEven(10);
        boolean even2 = isEven(7);
        System.out.println("10 是偶数: " + even1); // 输出: 10 是偶数: true
        System.out.println("7 是偶数: " + even2);  // 输出: 7 是偶数: false
    }
}

示例 3:摄氏度转换为华氏度

public class TemperatureConverter {
    public static double celsiusToFahrenheit(double celsius) {
        return (celsius * 9 / 5) + 32;
    }

    public static void main(String[] args) {
        double fahrenheit = celsiusToFahrenheit(25.0);
        System.out.println("25 摄氏度等于 " + fahrenheit + " 华氏度"); // 输出: 25 摄氏度等于 77.0 华氏度
    }
}