方法的使用


方法概念及使用

什么是方法(method)

方法就是一个代码片段. 类似于 C 语言中的 “函数”。

  1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
  2. 做到代码被重复使用, 一份代码可以在多个位置使用.
  3. 让代码更好理解更简单.
  4. 直接调用现有方法开发, 不必重复造轮子.

方法定义

方法的基本结构

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

【注意事项】

  1. 修饰符:现阶段直接使用public static 固定搭配
  2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void
  3. 方法名字:采用小驼峰命名
  4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
  5. 方法体:方法内部要执行的语句
  6. 在java当中,方法必须写在类当中
  7. 在java当中,方法不能嵌套定义
  8. 在java当中,没有方法声明一说

方法调用的执行过程

【方法调用过程】
调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行

注意

  • 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
  • 一个方法可以被多次调用.

代码示例1 计算两个整数相加

 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
public class Method {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("第一次调用方法之前");
int ret = add(a, b);
System.out.println("第一次调用方法之后");
System.out.println("ret = " + ret);
System.out.println("第二次调用方法之前");
ret = add(30, 50);
System.out.println("第二次调用方法之后");
System.out.println("ret = " + ret);
}
public static int add(int x, int y) {
System.out.println("调用方法中 x = " + x + " y = " + y);
return x + y;
}
}
// 执行结果
一次调用方法之前
调用方法中 x = 10 y = 20
第一次调用方法之后
ret = 30
第二次调用方法之前
调用方法中 x = 30 y = 50
第二次调用方法之后
ret = 80

实参和形参的关系

在Java方法中,形参(形式参数)和实参(实际参数)是两个密切相关但又不同的概念,它们共同构成了方法调用的参数传递机制。

形参(Formal Parameter)

  • 定义:方法声明时定义的参数
  • 位置:出现在方法签名中
  • 作用:指定方法接收什么类型的数据
  • 生命周期:从方法调用开始到方法执行结束
1
2
3
public void printMessage(String message) {  // message是形参
    System.out.println(message);
}

实参(Actual Parameter)

  • 定义:方法调用时实际传入的值或变量
  • 位置:出现在方法调用处
  • 作用:提供方法执行所需的具体数据
  • 生命周期:取决于实参本身的定义位置
1
printMessage("Hello World");  // "Hello World"是实参

对应关系

  • 实参和形参在数量、顺序和类型上必须严格匹配
  • 方法调用时,实参的值会传递给对应的形参

数据传递方式
Java中参数传递只有值传递一种方式:

  • 对于基本数据类型:传递的是值的副本
  • 对于引用数据类型:传递的是引用的副本(即对象地址的副本)

基本数据类型示例:

1
2
3
4
5
6
7
8
9
public static void modifyValue(int x) {  // x是形参
    x = 100;
}

public static void main(String[] args) {
    int num = 50;          // num是实参
    modifyValue(num);
    System.out.println(num);  // 输出50,原值未改变
}

引用数据类型示例:

1
2
3
4
5
6
7
8
9
public static void modifyArray(int[] arr) {  // arr是形参
    arr[0] = 100;
}

public static void main(String[] args) {
    int[] myArray = {1, 2, 3};  // myArray是实参
    modifyArray(myArray);
    System.out.println(myArray[0]);  // 输出100,数组内容被修改
}

重要特点

  • 单向传递:只能从实参传给形参,不能反向传递
  • 独立内存空间:形参和实参占用不同的内存空间
  • 作用域不同:
    • 形参只在方法内部有效
    • 实参的作用域取决于它定义的位置
  • 命名无关性:形参和实参的名称可以相同也可以不同

基本数据类型的修改不会影响实参

1
2
3
void change(int a) { a = 10; }
int x = 5;
change(x);  // x仍然是5

引用数据类型可以通过形参修改对象内容(但不能改变引用本身)

1
2
3
void changeArray(int[] arr) { arr[0] = 100; }
int[] nums = {1, 2, 3};
changeArray(nums);  // nums[0]变为100

String等不可变对象表现出类似基本类型的行为

1
2
3
void changeString(String s) { s = "new"; }
String str = "old";
changeString(str);  // str仍然是"old"

没有返回值的方法

方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成void

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
print(a, b);
}
public static void print(int x, int y) {
System.out.println("x = " + x + " y = " + y);
}
}

方法重载

方法重载概念

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class TestMethod {
public static void main(String[] args) {
add(1, 2); // 调用add(int, int)
add(1.5, 2.5); // 调用add(double, double)
add(1.5, 2.5, 3.5); // 调用add(double, double, double)
}
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}

注意:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
  3. 与返回值类型是否相同无关
  4. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

递归

递归的概念

一个方法在执行过程中调用自身, 就称为 “递归”.

递归的必要条件:

  1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
  2. 递归出口
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
if (n == 1) {
return 1;
}
return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
ret = 120
Think more and practice more!
微信:zxcyuijkl
使用 Hugo 构建
主题 StackJimmy 设计