目录
8. 方法概念及使用
8.1 方法定义
1. 语法格式
2. 详细说明
8.2 方法调用的执行过程
1. 具体过程
2. 栈帧的理解
8.3 实参和形参的关系
1. 形参(形式参数)
2. 实参(实际参数)
8.4 没有返回值的方法
8.5 方法重载
1. 核心概念
2. 重载的三大规则
3. 常见陷阱
4. 总结
8. 方法概念及使用
在介绍方法的使用前,我们先聊聊别的,还记得小时候玩过的积木吗?我们可以用各种形状的积木,搭建出城堡、汽车、甚至整个城市。而在Java编程中,方法就像这些积木,它们是预先定义好的代码块,可以完成特定的功能。
想象一下,你要写一个程序来制作一杯咖啡。你可以把“磨咖啡豆”、“烧开水”、“冲泡咖啡”这些步骤,分别写成独立的方法。然后,在主程序中,你只需要按照顺序调用这些方法,就能轻松制作出一杯香浓的咖啡;下面开始正式进入介绍。
8.1 方法定义
1. 语法格式
2. 详细说明
- 修饰符:
控制方法的访问权限,如public、private、protected或默认(不写)。
例如:`public` 表示该方法可以被其他类访问。
- 返回类型:
方法执行后返回的数据类型。如果方法不返回任何值,则使用void。返回值类型必须要与返回的实体类型一致。
例如:int表示方法返回一个整数,void表示方法不返回任何值。
- 方法名:
方法的名称,遵循标识符命名规则(驼峰命名法)。
例如:`calculateSum`、`printMessage`。
- 参数列表:
方法接收的输入参数,用逗号分隔。每个参数包括参数类型和参数名。如果没有参数,()中什么都不写。
例如:(int a, int b) 表示方法接收两个整数参数。
- 方法体:
包含方法的具体实现代码。
例如:计算、循环、条件判断等。
- return语句:
如果方法有返回类型(非 void),则必须使用 return 语句返回一个值。
例如:return a + b; 返回两个整数的和。注意:java中方法必须写在类中!
例子:调用方法计算两个数的和并输出。
java">public class Example {// 定义一个方法,计算两个整数的和public static int add(int a, int b) {int sum = a + b;return sum; // 返回计算结果}public static void main(String[] args) {// 调用add方法int result = add(5, 3);System.out.println("5 + 3 = " + result);}
}
结果:
java">5 + 3 = 8
8.2 方法调用的执行过程
流程大致如上图,下面博主进行详细介绍:
1. 具体过程
- 方法调用:
当程序执行到一个方法调用语句时(例如上面的代码
add(5, 3);
),Java虚拟机会暂停当前方法的执行,并开始执行被调用的方法。
- 参数传递:
如果方法有参数,调用时会将实际参数的值传递给形式参数(方法定义中的参数)。
例如上述代码中:调用
add(5, 3)
时,5
和3
会分别传递给方法定义中的int a
和int b
。
- 方法栈帧的创建:
Java虚拟机会为被调用的方法创建一个新的栈帧,并将其压入调用栈。
栈帧中存储了方法的局部变量、参数和返回地址等信息。
- 方法体的执行:
执行被调用方法的方法体中的代码。
例如:在
add
方法中,计算a + b
并将结果存储在局部变量sum
中。
- 返回值的处理:
如果方法有返回值(非
void
),则会将返回值传递给调用者。例如:
add
方法返回sum
的值,调用者可以接收并使用这个值。
- 栈帧的销毁:
方法执行完毕后,其对应的栈帧会从调用栈中弹出,释放内存。
程序继续执行调用方法的下一条语句。
- 继续执行调用的方法:
方法调用结束后,程序会回到调用的方法中,继续执行后续代码。方法在执行的过程中如果遇到了return,那么方法就结束了,意味着该方法在栈上开辟的内存就没有了。
定义方法的时候,不会执行方法的代码,只有调用时方法才会执行,并且一个方法可以被调用多次。
2. 栈帧的理解
在Java中,栈帧(Stack Frame) 是方法调用时在调用栈(Call Stack)中创建的一个数据结构,用于存储方法的执行信息。每个方法调用都会创建一个独立的栈帧,栈帧中包含了方法的局部变量、参数、操作数栈以及方法的返回地址等信息。
8.3 实参和形参的关系
在java中,实参的值永远都是赋值到形参中,形参和实参是两个实体。
1. 形参(形式参数)
-
定义:形参是方法定义时声明的参数,用于接收调用方法时传递的值。
-
特点:
-
形参的作用域仅限于方法内部。
-
形参是局部变量,方法执行结束后会被销毁。
-
java">// a 和 b 是形参
public static int add(int a, int b) { return a + b;
}
在上面的代码中,a
和 b
是形参,它们的作用是接收调用方法时传递的实际值。
2. 实参(实际参数)
-
定义:实参是方法调用时传递给方法的具体值或变量。
-
特点:
-
实参可以是常量、变量或表达式。
-
实参的值会在方法调用时传递给形参。
-
java">int result = add(5, 3); // 5 和 3 是实参
在上面的代码中,5
和 3
是实参,它们会被传递给 add
方法的形参 a
和 b
。
下面是一个简单的例子帮助友友们的理解,希望能对大家有帮助:
java">public class ParameterExamp {// 定义一个方法,a 和 b 是形参public static int add(int a, int b) {a = a + 10; // 修改形参 a 的值return a + b;}public static void main(String[] args) {int x = 5;int y = 3;// 调用 add 方法,x 和 y 是实参int result = add(x, y);System.out.println("结果是: " + result); // 输出 18System.out.println("x 的值: " + x); // 输出 5(x 的值未被修改)}
}
首先方法调用:
在
main
方法中,定义变量x
和y
,并赋值5
和3
。调用
add(x, y)
时,实参x
和y
的值会被传递给形参a
和b
。
接着数据传递:
实参
x
的值5
被复制给形参a;
实参y
的值3
被复制给形参b
。
然后是方法执行:
在
add
方法中,形参a
的值被修改为a + 10
(即15
)。计算
a + b
,结果为18
,并返回。
最后是方法返回:
方法执行完毕后,形参
a
和b
被销毁。实参x
和y
的值不受影响,仍然是5
和3
。
8.4 没有返回值的方法
方法的返回值是可选的,有些时候可以没有的,没有时返回值类型必须写成void。
语法格式如下:
java">[访问修饰符] void 方法名([参数列表]) {// 方法体// 执行某些操作
}
举例说明:最终结果为8
java">public class Calculator {// 定义一个没有返回值的方法,用于执行加法并打印结果public static void addAndPrint(int a, int b) {int result = a + b; // 调用加法操作System.out.println("结果: " + result); // 调用打印方法}public static void main(String[] args) {addAndPrint(5, 3); // 调用 void 方法}
}
8.5 方法重载
首先,方法重载是什么?
1. 核心概念
在同一个类中,允许存在多个“同名方法”,但它们的“参数列表必须不同”(类型、数量或者是顺序要不同)。
变形金刚版解释:想象你有一个叫“擎天柱”的机器人,它能根据敌人类型切换武器形态——参数不同,行为不同,但名字还是“擎天柱”!(ps博主还是比较喜欢大黄蜂~)
2. 重载的三大规则
1️⃣ 参数类型不同
2️⃣ 参数数量不同
3️⃣ 参数顺序不同
🚫 注意:返回类型不同但参数列表相同?不算重载!这是“无效分身术”!
例子:不同参数类型的重载
java">public class Calculator {// 处理两个整数相加public static int add(int a, int b) {return a + b;}// 处理两个小数相加public static double add(double a, double b) {return a + b;}// 处理三个整数相加public static int add(int a, int b, int c) {return a + b + c;}public static void main(String[] args) {System.out.println("结果1: " + add(2, 3)); System.out.println("结果2: " + add(2.5, 3.5));System.out.println("结果3: " + add(1, 2, 3));}
}
结果为:
java">结果1: 5
结果2: 6.0
结果3: 6
3. 常见陷阱
-
仅返回类型不同
java">// 错误示范!编译器会翻脸!
public static int add(int a, int b) { return a + b; }
public static double add(int a, int b) { return (double)(a + b); }
错误提示:Method add(int, int) is already defined
(方法重复定义)
-
参数名不同不算重载
java">// 错误示范!参数名不同但类型相同,不算重载! public static void log(String message) { ... } public static void log(String text) { ... } // 编译错误!
4. 总结
-
同名不同参:参数类型、数量或顺序必须不同。
-
返回类型随意:可以不同,但不足以构成重载。
-
不关心权限修饰符:
public
、private
等修饰符不影响重载。
制作不易,感谢友友们的点赞收藏关注,如有问题欢迎批评指正,祝友友们生活愉快,学习工作顺顺利利!