一、前言
Java中的方法是一种在Java编程中非常常见的概念。
我们可以将方法看作是一种可重复使用的代码块,类似于生活中的工具。就像我们在日常生活中会使用各种各样的工具来完成不同的任务一样,我们在编程中也可以使用方法来完成各种不同的操作。
二、方法的概念和使用
1、什么是方法
方法就是一个代码片段.。类似于 C 语言中的 “函数”。方法允许我们将代码进行组织和封装,这有助于提高代码的可读性、可重用性和可维护性。方法可以接受参数,执行一系列操作,并返回一个结果。
方法存在的意义:
-
是能够模块化的组织代码(当代码规模比较复杂的时候).
-
做到代码被重复使用, 一份代码可以在多个位置使用.
-
让代码更好理解更简单.
-
直接调用现有方法开发, 不必重复造轮子
2、方法的定义
修饰符 返回值类型 方法名称(方法参数列表) {
// 方法体(method body)
// 包含实现特定任务的代码
}
例如:写一个方法求两个整数的和
public static int addNumbers(int num1, int num2) {
int sum = num1 + num2;
return sum;
}
【注意事项】
-
修饰符:现阶段直接使用
public static
固定搭配 -
返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成
void
-
方法名字:采用小驼峰命名
-
参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
-
方法体:方法内部要执行的语句
-
在java当中,方法必须写在类当中
-
在java当中,方法不能嵌套定义
-
在java当中,没有方法声明一说(C语言需要进行方法声明)
3、方法调用的过程
调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法往下执行
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;
}
}
方法的调用,每次都会在栈上开辟内存!
4、实参和形参的关系
方法的形参相当于数学函数中的自变量
1
+
2
+
3
+
…
+
n
的公式为:
s
u
m
(
n
)
=
n
∗
(
n
+
1
)
/
2
1 + 2 + 3 + … + n的公式为:sum(n) = n*(n+1)/ 2
1+2+3+…+n的公式为:sum(n)=n∗(n+1)/2
**Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。**形参的名字可以随意
取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。
public static int add(int a, int b){
return a + b;
}
add(2, 3); // 2和3是实参,在调用时传给形参a和b
注意:在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
举个例子:
public class TestMethod {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println("main: a = " + a + " b = " + b);
}
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
System.out.println("swap: x = " + x + " y = " + y);
}
}
// 运行结果
swap: x = 20 y = 10
main: a = 10 b = 20
在swap
函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。那么为什么呢?
实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中。因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。对于基础类型来说, 形参相当于实参的拷贝,即 传值调用。
【解决办法】: 传引用类型参数 (例如使用数组来解决这个问题)
public static void swap(int[] arr) {
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
三、方法重载
1、函数重载的概念
在自然语言中,经常会出现“一词多义”的现象,比如:“好人”。
在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java中方法也是可以重载的。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
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;
}
}
【注意】
-
方法名必须相同
-
参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
-
与返回值类型是否相同无关
-
两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
-
编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
2、方法签名
在同一个作用域中不能定义两个相同名称的标识符。
比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
public class TestMethod {
public static int add(int x, int y){
return x + y;
}
public static double add(double x, double y){
return x + y;
}
public static void main(String[] args) {
add(1,2);
add(1.5, 2.5);
}
}
上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:
-
先对工程进行编译生成.class字节码文件
-
在控制台中进入到要查看的.class所在的目录
-
输入:javap -v 字节码文件名字即可
方法签名中的一些特殊符号说明: