方法的定义和调用
方法的基本概念
方法(Method)是 Java 中组织代码的基本单元,也称为函数。它是一段可重用的代码块,用于执行特定任务。方法可以接收输入(参数)、处理逻辑,并返回输出(返回值)。使用方法可以提高代码的可读性、可维护性和复用性。
方法的组成部分:
- 修饰符:如 public、private、static(可选)。
- 返回类型:方法返回的值类型,如 int、void(无返回)。
- 方法名:小驼峰命名法(如 calculateSum)。
- 参数列表:括号内,多个参数用逗号分隔(如 (int a, int b))。
- 方法体:大括号内,包含执行代码。
- 异常抛出:可选,如 throws Exception
语法:
1 | 修饰符 返回类型 方法名(参数类型 参数名, ...) { |
方法的定义
- 实例方法:属于对象,需要通过对象调用。
- 静态方法:属于类,用 static 修饰,通过类名调用。注意:void 方法无需 return,但可用 return; 提前退出.
1
2
3
4
5
6
7
8
9
10
11
12public class MethodDefine {
// 静态方法:求两个整数的和
public static int add(int a, int b) {
int sum = a + b;
return sum; // 返回结果
}
// 实例方法:打印问候
public void greet(String name) {
System.out.println("Hello, " + name + "!");
}
}
方法的调用
- 静态方法调用:类名.方法名(参数)。
- 实例方法调用:new 对象().方法名(参数)。
- 参数传递:Java 是值传递(基本类型传值,引用类型传引用地址)。
1 | public class MethodCall { |
参数传递细节:
- 基本类型(如 int):修改形参不影响实参。
- 引用类型(如数组):修改内容会影响原对象,但重新赋值不影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class PassByValue {
public static void changeInt(int x) {
x = 20; // 只改形参
}
public static void changeArray(int[] arr) {
arr[0] = 100; // 修改数组内容
}
public static void main(String[] args) {
int num = 10;
changeInt(num);
System.out.println(num); // 仍为 10
int[] array = {1, 2};
changeArray(array);
System.out.println(array[0]); // 100
}
}
方法的重载
方法重载的基本概念
方法重载(Overloading)允许在同一类中定义多个同名方法,但参数列表不同(数量、类型、顺序)。JVM 根据调用时的参数选择合适方法。重载不考虑返回类型或修饰符。
语法:
- 方法名相同。
- 参数不同:数量、类型、顺序。
- 可以有不同返回类型,但不能仅靠返回类型区分。调用重载方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class OverloadDemo {
// 重载:两个 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;
}
}1
2
3
4
5
6
7
8
9public class OverloadCall {
public static void main(String[] args) {
OverloadDemo obj = new OverloadDemo();
System.out.println(obj.add(1, 2)); // 调用两个 int:3
System.out.println(obj.add(1, 2, 3)); // 调用三个 int:6
System.out.println(obj.add(1.5, 2.5)); // 调用 double:4.0
}
}分析:JVM 匹配最精确的方法。如果无精确匹配,会自动类型转换(如 int 到 double),但可能导致歧义错误。
重载与类型转换
- 优先精确匹配。
- 次之自动提升(如 byte 到 int)。
如果有 add(int, int) 和 add(double, double),调用 add(1, 2.0) 会匹配 double(因为 1 转 double)。歧义示例(编译错误):
1
2
3public int method(long a) { ... }
public int method(int a) { ... }
// method(5) 歧义:5 可为 int 或 long
常见错误避免
- 仅返回类型不同:不允许重载,编译错误。
- 参数名不同:不构成重载,只看类型。
- 修饰符不同:不影响重载。
- 重载 vs 重写:重载在同一类,重写在子类(Override)。
命令行传递参数
命令行参数的基本概念
Java 程序可以通过命令行传递参数给 main 方法。main 的签名:public static void main(String[] args),args 是字符串数组,存储参数。
运行时:在命令行或 IDE 配置参数,如 java ClassName param1 param2。
1 | public class CommandLineArgs { |
可变参数
可变参数的基本概念
可变参数(Varargs)允许方法接收任意数量的同类型参数。从 Java 5 开始,用 … 表示,如 (int… numbers)。
内部:作为数组处理。只能是最后一个参数。
语法:
1 | public void method(Type... varName) { |
1 | public class VarargsDemo { |
调用可变参数
1 | public class VarargsCall { |
分析:sum() 时 numbers = 空数组。传数组直接兼容。
递归
递归的基本概念
递归是方法调用自身解决问题。包括:
- 基例:终止条件,避免无限递归。
- 递归步:缩小问题,趋近基例。
好处:简化复杂问题,如树遍历。缺点:栈溢出风险。
1 | public class RecursionDemo { |
调用递归
1 | public class RecursionCall { |
- 注意:能不用递归就不用递归,比较消耗内存