一、方法的基本使用
1.什么是方法?
方法就是把一个以后可能会多次使用的一段代码,把它封装成一个功能。
可以把方法理解为C语言里的函数,但只是类似于C语言的函数并不是完全相同的。
方法存在的意义:
1.在复杂的场景然代码模块化
2.让一份代码在多个位置重复使用
3.让代码更容易理解
4.多次使用一个功能时,直接调用方法避免代码的冗余
2.方法定义语法
//方法定义
public static 方法返回值 方法名称 ([参数类型 形参]){
方法体代码;
[return 返回值]
}
//方法调用
返回值变量 = 方法的名称(实参...);
代码示例:
调用方法求两个数的较大值
public class Test{
public static int max(int a,int b){
return a>b?a:b;
}
public static void main(String[] args) {
int a = 100;
int b = 200;
int ret = max(a,b);
System.out.println(ret);
}
}
执行代码会方法返回了两个数的最大值:
3.方法调用和内存的关系
java中JVM上共有5块内存区域,方法的调用是依赖于站的,每次调用一个方法,都会在栈上为这个方法开辟一块内存,把这个内存叫做:栈帧
我们平时所说的栈:就是JVM Stack 也就是JAVA虚拟机栈
栈的原理是:先进后出。那我们上面的求两个数的最大值的代码来说
但方法运行完 return 后
当整个程序结束后main方法同样也会被释放掉,这就是栈的先进后出原理。
4.形参和实参的关系
实参也叫实际参数,是调用方法传递过去的参数。
形参也叫形式参数,是方法接收实参的参数。
来看一段代码:
public class Test{
public static void exchange(int a,int b){
int tmp = a;
a = b;
b = tmp;
}
public static void main(String[] args) {
int a = 100;
int b = 200;
exchange(a,b);
System.out.println("a="+a+" b="+b);
}
}
运行结果
a和b的值并没有进行交换。
因为我们传递的是实参,接收的是形参。而形参只是实参的一份临时拷贝,在exchange方法里我们交换的只是形参的值。我们上面也说过,方法在调用完后会被自动销毁,所以a和b的值并没有发生改变。
那要怎么样样才能交换这两个值呢,那就是传引用,这里先不细说,后面的博客会讲到。
还有一些要注意的点:
1.在java当中没有取地址(&)这种操作
2.在java中栈上的地址是拿不到的
3.在传递参数时形参和实参要一,一对应(类型和顺序)
二、方法的重载
有些时候我们需要用一个函数同时兼容多种参数的情况, 我们就可以使用到方法的重载。
来看一个例子,就比如我要求两个数的和
我们可以看到我们这个求和方法,只能求整形但传浮点型的参数时就报错。那是不是还要再写一个函数呢?
public class Test{
public static int addInt(int a,int b){
return a+b;
}
public static double addDouble(double a, double b){
return a+b;
}
public static void main(String[] args) {
int a = 100;
int b = 200;
double c = 25.5;
double d = 35.5;
System.out.println(addInt(a, b));
System.out.println(addDouble(c, d));
}
}
那我们是不是改写这样的代码呢?其实这样并不好,int类型一个,double类型一个,那如果我们需要三个或者四个int或者double的数相加呢,那不是要很多个方法名?所以这样并不好。还不如直接都叫add,这里就需要用到方法的重载了。
来看代码
public class Test{
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) {
int a1 = 100;
int a2 = 200;
int a3 = 200;
double b1 = 25.5;
double b2 = 35.5;
System.out.println(add(a1, a2));
System.out.println(add(a1,a2,a3));
System.out.println(add(b1,b2));
}
}
运行结果
我们发现方法名相同,但参数的返回类型和参数的个数不同都能使用。
同一个方法名字, 提供不同版本的实现, 称为 方法重载
如果方法名和参数列表都相同,方法重载就会不可用,编译器会报错。
重载的规则:
1.方法名相同
2.方法的参数列表不同(返回类型和参数个数)
3.方法的返回值不做要求(返回值一样或者不一样,不影响重载)
三、方法的递归
递归:其实就是方法自己调用自己的一个过程
1.递归的注意事项
1.要有一个趋近于终止的条件
2.写递归程序时,递归公式是要自己推到的(这也是一个难点)
2.递归过程
来看一段代码,递归求N的阶层
public class Test{
public static int fac(int n){
if(n==1){
return 1;
}else{
return n*fac(n-1);
}
}
public static void main(String[] args) {
System.out.println(fac(4));
}
}
运行结果
再来通过图看一下详细的递归过程
3.递归总结
1.递归其实就是然代码简洁化,有些问题递归和迭代(循环)都能解决,而且迭代会更快。
2.能用迭代用迭代不能迭代用递归。
注意:如果递归程度太深会出现栈溢出异常
栈溢出异常的原因有两种:
1.参数太大
2.终止条件不对
感谢阅读!下一篇数组马上更新!