方法
约 1049 字大约 4 分钟
布欧-Lewyon
2026-05-14
方法是将一段逻辑命名为可复用的代码块。本节涵盖方法声明、参数传递、返回值、重载、可变参数以及需要注意的值传递语义。
方法声明
方法是类内部将一段逻辑封装为可复用单元的手段。声明时需指定修饰符(如 public)、返回类型(或 void)、方法名、参数列表(可空)和方法体。调用方法时,实参的值会复制给形参,方法体执行完毕后通过 return 将结果返回给调用处。
方法声明的语法模板如下。返回值类型若为 void 时 return 可省略(或只写 return; 表示提前退出):
修饰符 返回类型 方法名(参数类型 参数名, ...) {
// 方法体
return 返回值;
}- 返回类型:若方法不返回值,用
void,此时return可省略或单独写return;。 - 方法名:小驼峰命名,动词开头(如
calculateTotal、getName)。 - 参数:调用者传入的值,可以为空。
完整示例:以下 Calculator 类演示了有返回值和无返回值的两种方法:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public void printSum(int a, int b) {
System.out.println("Sum: " + (a + b));
// 隐式 return
}
}参数传递:值传递
Java 中所有参数传递都是值传递(pass-by-value):
- 对于基本类型,传递的是值的副本,方法内修改形参不影响实参。
- 对于引用类型,传递的是引用的副本(即对象地址的复制),方法内通过该引用修改对象属性会反映到原对象,但将形参重新赋值为新对象不影响外部引用。
public class PassByValueDemo {
public static void changePrimitive(int x) {
x = 100; // 不影响外部
}
public static void changeReference(StringBuilder sb) {
sb.append(" World"); // 修改对象内容,外部可见
}
public static void reassignReference(StringBuilder sb) {
sb = new StringBuilder("New"); // 重新赋值,不影响外部
}
public static void main(String[] args) {
int num = 10;
changePrimitive(num);
System.out.println(num); // 10
StringBuilder s = new StringBuilder("Hello");
changeReference(s);
System.out.println(s); // Hello World
reassignReference(s);
System.out.println(s); // Hello World(未变)
}
}方法重载(Overloading)
同一个类中可以有多个同名方法,只要参数列表不同(类型、个数、顺序不同即可),与返回类型无关。
public class Printer {
public void print(String s) {
System.out.println(s);
}
public void print(int x) {
System.out.println(String.valueOf(x));
}
public void print(String prefix, int x) {
System.out.println(prefix + x);
}
}编译器根据调用时传入的参数类型和个数确定具体调用哪个重载版本。重载时返回类型不同但参数列表相同是不允许的,会导致编译错误。
可变参数(Varargs)
当不确定参数个数时,用 类型... 参数名 声明,方法内部当作数组处理:
public class VarargsDemo {
public static int sum(int... numbers) {
int total = 0;
for (int n : numbers) {
total += n;
}
return total;
}
public static void main(String[] args) {
System.out.println(sum(1, 2, 3)); // 6
System.out.println(sum(1, 2, 3, 4, 5)); // 15
System.out.println(sum()); // 0(合法,空数组)
}
}- 可变参数必须是方法参数列表的最后一个。
- 可搭配普通参数:
public void log(String format, Object... args)
小结
- 方法声明由修饰符、返回类型、方法名、参数列表和方法体组成;
void表示不返回值。 - Java 只有值传递:基本类型传值的副本,引用类型传引用的副本——形参重新赋值不影响实参。
- 重载根据参数列表(类型、个数、顺序)区分,与返回类型无关;仅返回类型不同会编译报错。
- 可变参数
类型... 参数名必须是最后一个参数,内部当作数组使用。 - 易错:重载时如果参数列表包含基本类型和对应包装类型(如
int与Integer),编译器会选择最精确匹配,不会自动装箱后再重载——理解这一点能避免意外调用到错误的方法版本。 - 思考任务:写一个类包含
print(int)和print(String)两个重载,调用print(null)会选哪个?(提示:编译器会报歧义错误。)
上一节:流程控制
下一节:Lambda 与函数式接口
