Java 方法(方法定义与调用)
方法是组织代码的基本单元,用于封装功能逻辑。理解方法的定义、调用、参数传递和返回值是编写模块化程序的基础。本章将详细介绍 Java 方法的使用。
方法定义、参数、返回值
方法定义
语法:
[访问修饰符] [static] [final] 返回类型 方法名(参数列表) {
// 方法体
return 返回值; // 如果有返回值
}
组成部分:
- 访问修饰符:public、private、protected、默认
- static:静态方法(可选)
- final:最终方法(可选)
- 返回类型:方法返回的数据类型,void 表示无返回值
- 方法名:遵循命名规范(小驼峰)
- 参数列表:方法接收的参数
- 方法体:方法执行的代码
无参数无返回值
public void sayHello() {
System.out.println("Hello, World!");
}
有参数无返回值
public void greet(String name) {
System.out.println("Hello, " + name + "!");
}
// 多个参数
public void introduce(String name, int age) {
System.out.println("我是 " + name + ",今年 " + age + " 岁");
}
有返回值
// 返回基本类型
public int add(int a, int b) {
return a + b;
}
// 返回引用类型
public String getFullName(String firstName, String lastName) {
return firstName + " " + lastName;
}
// 返回数组
public int[] getNumbers() {
return new int[]{1, 2, 3, 4, 5};
}
方法调用
public class MethodExample {
// 定义方法
public void sayHello() {
System.out.println("Hello");
}
public int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
MethodExample obj = new MethodExample();
// 调用无返回值方法
obj.sayHello();
// 调用有返回值方法
int result = obj.add(10, 20);
System.out.println("结果:" + result);
}
}
参数传递
1. 基本类型参数(值传递)
public void modifyValue(int x) {
x = 100; // 只修改局部变量,不影响原变量
}
public static void main(String[] args) {
int num = 10;
modifyValue(num);
System.out.println(num); // 仍然是 10
}
2. 引用类型参数(引用传递)
public void modifyArray(int[] arr) {
arr[0] = 100; // 修改数组元素
}
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
modifyArray(numbers);
System.out.println(numbers[0]); // 100(被修改了)
}
注意:Java 中所有参数传递都是值传递,但对于引用类型,传递的是引用的副本,所以可以修改对象的内容。
3. 可变参数(varargs)
// 可变参数必须是最后一个参数
public int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
// 调用
int result1 = sum(1, 2, 3); // 6
int result2 = sum(1, 2, 3, 4, 5); // 15
int result3 = sum(); // 0
可变参数内部是数组:
public void print(String... messages) {
for (String msg : messages) {
System.out.println(msg);
}
}
方法重载
什么是方法重载
方法重载(Overloading):同一个类中可以有多个同名方法,但参数列表必须不同。
规则:
- 方法名相同
- 参数列表不同(类型、个数、顺序)
- 返回类型可以不同(但不能仅靠返回类型区分)
- 访问修饰符可以不同
重载示例
public class Calculator {
// 两个 int 参数
public int add(int a, int b) {
return a + b;
}
// 三个 int 参数
public int add(int a, int b, int c) {
return a + b + c;
}
// double 参数
public double add(double a, double b) {
return a + b;
}
// 参数顺序不同
public void print(String name, int age) {
System.out.println(name + ", " + age);
}
public void print(int age, String name) {
System.out.println(age + ", " + name);
}
}
重载解析
Calculator calc = new Calculator();
calc.add(1, 2); // 调用 add(int, int)
calc.add(1, 2, 3); // 调用 add(int, int, int)
calc.add(1.0, 2.0); // 调用 add(double, double)
编译器根据参数类型和数量选择方法。
重载注意事项
1. 不能仅靠返回类型区分
// ❌ 错误:仅返回类型不同,不能重载
public int getValue() { return 1; }
public String getValue() { return "1"; } // 编译错误
2. 类型转换
public void method(int x) { }
public void method(long x) { }
// 调用
method(10); // 调用 method(int),因为 10 是 int 类型
method(10L); // 调用 method(long)
3. 自动类型提升
public void method(byte x) { }
public void method(int x) { }
byte b = 10;
method(b); // 调用 method(byte)
method(10); // 调用 method(int)
// 如果没有 method(byte),会自动提升为 method(int)
递归方法示例
什么是递归
递归(Recursion):方法调用自身。
要素:
- 递归终止条件:避免无限递归
- 递归调用:方法调用自身
- 问题规模减小:每次递归问题规模应该减小