文章目录
方法
一、方法的基本用法
1. 什么是方法
方法就是一个代码片段. 类似于 C 语言中的 “函数”. 其实就是一个功能,可以重复使用
方法存在的意义:
- 是能够模块化的组织代码(当代码规模比较复杂的时候).
- 做到代码被重复使用, 一份代码可以在多个位置使用.
- 让代码更好理解更简单.
- 直接调用现有方法开发, 不必重复造轮子.
2. 方法定义语法
// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];//可以有可以没有 (看返回值类型是不是void )
}
// 方法调用
返回值变量 = 方法名称(实参...);
注意:方法一般用小驼峰命名
3.方法的调用
例子:写一个方法实现两个数相加
class Test {
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
4.形参和实参的关系
注意事项:
在Java中是拿不到变量的地址的,
所以在Java中只有按值传递
传参的时候注意匹配问题
整个函数在使用过程当中都要注意匹配问题
1. 形参和实参数据类型匹配
2. 形参和实参的个数匹配
3. 返回值和方法的返回类型匹配
4. 接收方法返回值的变量也需要和其返回值类型匹配
可以用sout直接输出 函数的返回值(函数返回值支持链式调用)
但是函数必须有返回值!
在Java中没有所谓的函数的声明
放在最上面和最下面 都可以(和C语言不同)
如果想要拿到地址,只能把变量放到堆上,这样就可以拿到地址
(但放到堆上的都是对象)
例子:交换两个整型变量的值
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println("a = " + a + " b = " + b);
}
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
}
}
// 运行结果
a = 10 b = 20
上面的代码是错误代码🚫
因为形参是实参的一份拷贝 对形参的改变不会影响实参
x 和 y是处在swap()方法里的局部变量 代码的作用是交换了x和y的值
而main方法中的a和b并没有发生改变
并且调用完swap()函数之后 里面的变量就销毁了
Java中无法直接通过栈地址拿到变量,但是Java中存在引用变量
,形参传递引用变量就可以解决这个问题
变量的引用就相当变量的地址,只不过该变量的类型应为对象(放在堆上)
如何交换?
–可以利用数组 !
二、方法的重载
到这里和C就开始不一样了
1. 什么是重载
首先理解什么是重载
可能会有这样的场景:
我们想实现一个加法函数,会实现多个函数
addInt(int x,int y)--两个整型相加
addFloat(float x,float y)--两个浮点型相加
addDouble(double x,double y)--两个双精度浮点型相加
addInt3(int x,int y,int z)---三个整型相加
可以看到 需要定义多个函数,并且名字不一样
那么我们在使用的时候就需要考虑 实现的是什么加法
从而调用相应的函数名字
但是我们平时使用的计算器,不管你输入的是什么类型,还是输入几个数
只需要按 +
就可以,即,只需要一个add
函数名就可以
使用同一个方法名字,提供不同版本的实现,就称为方法重载
2. 方法重载的三个条件
- 方法名相同
- 方法的参数列表不同(个数,类型)
- 方法的返回值不做要求.
也就是说:靠第二个条件,即参数列表来识别不同的重载!
如果定义重载的时候第二个条件相同就会报错!因为会认为是同一个重载
3. 重载的使用:
方法的名字都叫 add. 但是有的 add 是计算 int 相加, 有的是 double 相加; 有的计算两个数字相加, 有的是计算三个数
字相加.
同一个方法名字, 提供不同版本的实现, 称为 方法重载
三、方法递归
方法的递归和C中函数的递归基本一样
一个方法在执行过程中调用自身, 就称为 “递归”
比较简单 就以例子来说
简单举个例子
1. 例子:求5的阶乘
public static int factor(int n) {
if (n == 1) {
return 1;
}
int ret = n * factor(n - 1);
return ret;
}
public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
递归展开图
2. 其他递归练习
1. 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
2. 递归求 1 + 2 + 3 + ... + 10
3. 写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,
它的和是19
4. 求斐波那契数列的第 N 项
5. (思考)-> 非递归实现求斐波那契,递归斐波那契的缺陷