Java方法(函数)详细教程

1. 方法的基本概念

方法是Java中执行特定任务的代码块,也称为函数。方法的主要目的是提高代码的复用性和可维护性。

方法的优点:

  • 代码复用:避免重复编写相同的代码
  • 模块化:将复杂问题分解为小模块
  • 易于维护:修改只需在一个地方进行

2. 方法的定义

方法的基本语法结构:

1
2
3
4
[访问修饰符] [static] 返回类型 方法名([参数列表]) {
// 方法体
[return 返回值;]
}

示例:

1
2
3
4
public static int add(int a, int b) {
int sum = a + b;
return sum;
}

3. 方法的组成部分

3.1 访问修饰符

  • public: 公开访问
  • private: 仅类内可访问
  • protected: 同包和子类可访问
  • (默认): 同包可访问

3.2 static关键字

  • 静态方法:属于类,可直接通过类名调用
  • 非静态方法:属于对象,需要通过对象实例调用

3.3 返回类型

  • 基本数据类型:int, double, boolean等
  • 引用类型:String, 自定义类等
  • void: 无返回值

3.4 方法名

  • 遵循标识符命名规则
  • 建议使用动词或动词短语

3.5 参数列表

  • 可以包含零个或多个参数
  • 每个参数包括类型和名称
  • 多个参数用逗号分隔

3.6 方法体

  • 包含实现功能的代码
  • 可以有局部变量
  • 可以有控制结构

3.7 return语句

  • 用于返回方法的结果
  • void方法可以省略return或使用return;提前结束方法

4. 方法的调用

4.1 静态方法调用

1
ClassName.methodName(arguments);

4.2 非静态方法调用

1
ObjectName.methodName(arguments);

4.3 方法调用的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MethodDemo {
public static void main(String[] args) {
// 调用静态方法
int result = MathUtils.add(5, 3);
System.out.println("5 + 3 = " + result);

// 调用非静态方法
MethodDemo demo = new MethodDemo();
demo.greet("Alice");
}

public void greet(String name) {
System.out.println("Hello, " + name + "!");
}
}

class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}

5. 方法参数

5.1 形参和实参

  • 形参:方法定义时声明的参数
  • 实参:方法调用时传入的实际值

5.2 参数传递机制

  • 基本数据类型:值传递(传递值的副本)
  • 引用类型:值传递(传递引用的副本)

5.3 可变参数(Varargs)

Java支持可变数量的参数:

1
2
3
4
5
6
7
8
9
10
11
public static int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}

// 调用
sum(1, 2, 3); // 返回6
sum(1, 2, 3, 4, 5); // 返回15

6. 方法重载(Overloading)

在同一个类中,允许有多个同名方法,只要它们的参数列表不同。

重载规则:

  1. 方法名必须相同
  2. 参数列表必须不同(类型、数量或顺序)
  3. 返回类型可以不同(但不能仅返回类型不同)
  4. 访问修饰符可以不同

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Calculator {
public int add(int a, int b) {
return a + b;
}

public double add(double a, double b) {
return a + b;
}

public int add(int a, int b, int c) {
return a + b + c;
}
}

7. 递归方法

方法调用自身称为递归。

示例:计算阶乘

1
2
3
4
5
6
7
public static int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}

递归注意事项:

  1. 必须有终止条件
  2. 每次递归应使问题规模减小
  3. 递归深度过大会导致栈溢出

8. 方法的文档注释

良好的文档注释可以提高代码可读性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 计算两个整数的和
*
* @param a 第一个加数
* @param b 第二个加数
* @return 两个参数的和
* @throws IllegalArgumentException 如果参数为负数
*/
public static int add(int a, int b) throws IllegalArgumentException {
if (a < 0 || b < 0) {
throw new IllegalArgumentException("参数不能为负数");
}
return a + b;
}

9. 方法的最佳实践

  1. 单一职责原则:一个方法只做一件事
  2. 合理命名:方法名应准确描述其功能
  3. 控制方法长度:一般不超过50行
  4. 减少参数数量:最好不超过5个
  5. 避免副作用:除非必要,不要修改传入的参数
  6. 适当使用异常:处理错误情况

10. 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class MethodExamples {
public static void main(String[] args) {
// 调用各种方法示例
printHello();

int sum = addNumbers(5, 7);
System.out.println("5 + 7 = " + sum);

System.out.println("Max of 10 and 20: " + findMax(10, 20));

System.out.println("Factorial of 5: " + factorial(5));

System.out.println("Average: " + calculateAverage(1, 2, 3, 4, 5));
}

// 无参数无返回值方法
public static void printHello() {
System.out.println("Hello, World!");
}

// 带参数有返回值方法
public static int addNumbers(int a, int b) {
return a + b;
}

// 返回较大值的方法
public static int findMax(int a, int b) {
return a > b ? a : b;
}

// 递归方法计算阶乘
public static int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
return n * factorial(n - 1);
}

// 可变参数方法计算平均值
public static double calculateAverage(double... numbers) {
if (numbers.length == 0) {
return 0;
}

double sum = 0;
for (double num : numbers) {
sum += num;
}
return sum / numbers.length;
}
}

总结

Java方法是构建程序的基本模块,掌握方法的定义、使用和各种特性对于编写高质量的Java代码至关重要。通过合理使用方法,可以使代码更加模块化、可读性更强、更易于维护。