Java 方法 Java程序中方法的用法重载和递归
波风张三 人气:0前言
“方法”又被称为“函数”,其他的编程语言也有这个概念,重要性不言而喻,在这个文章,将介绍如何定义和使用方法。
一、方法的基本用法
1.什么是方法
在Java中,方法定义在类中,它和类的成员属性(数据成员)一起构建一个完整的类。构成方法有四大类——返回值类型、方法名称、参数、方法体。
方法就像一个功能,当我们需要用到的时候,就去调用它,不用的时候就放到一边。
也可以说它是一本工具书,当我们需要查看的时候,我们就会去找这本书查资料,不用的时候就放在书柜里面。
2.方法的基本定义
//方法定义
public static 方法返回值 方法名称([参数类型 形参 …]){
方法体代码;
[return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参…);
可以看出,方法包含一个方法头和一个方法体。
返回值类型:指定了方法返回的数据类型。它可以是任意有效的类型,包括构造类型(类就是一种构造类型)。如果方法没有返回值,则其返回类型必须是void。方法体中的返回值类型要与方法头中定义的返回值类型一致。
public class TestDemo { public static void main(String[] args) { int a = 10; int b = 20; // 方法的调用 int ret = add(a, b); System.out.println("ret = " + ret); } // 方法的定义 public static int add(int x, int y) { return x + y; } }
3.方法调用的执行过程
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
- 当方法被调用的时候, 会将实参赋值给形参.
- 参数传递完毕后, 就会执行到方法体代码.
- 当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行.
- 一个方法可以被多次调用
4.方法中的实参和形参
形参:
在定义一个方法时,参数列表中的参数个数至少为1个。
实参:
调用方法时,需要调用者提供与原方法定义相匹配的参数(类型、数量、顺序都一致)
那么形参与实参的关系又是怎样的呢?
- 形参变量隶属于方法体,也就是说它们是方法的局部变量,只有在被调用的时候才被创建,才被临时性分配内存,在调用结束后,立即释放所分配的内存单元。也就是说,当方法调用返回后,就不能再使用这些参数了。
- 在调用方法时,实参和形参在数量上、类型上、顺序上应严格保证一一对应的关系,否则就会出现参数类型不匹配的错误,从而导致调用方法失败。如下:
二、方法的重载
1.重载的概念
【概念】
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
2.例题分析
认真看下面例子中的add方法
public static void main(String[] args) { int a = 10; int b = 20; int ret = add(a, b); System.out.println("ret = " + ret); double a2 = 10.5; double b2 = 20.5; double ret2 = add(a2, b2); System.out.println("ret2 = " + ret2); double a3 = 10.5; double b3 = 10.5; double c3 = 20.5; double ret3 = add(a3, b3, c3); System.out.println("ret3 = " + ret3); } 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; }
【总结】
方法的名字都叫 add. 但是有的 add 是计算 int 相加, 有的是 double 相加; 有的计算两个数字相加, 有的是计算三个数
字相加.
同一个方法名字, 提供不同版本的实现, 称为 方法重载
【注意】
一.方法名一定要相同。
二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体。
1.如果参数个数不同,就不管它的参数类型了!
2.如果参数个数相同,那么参数的类型必须不同。
三.方法的返回类型、修饰符可以相同,也可不同。
data = pd.read_csv( 'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())
三、方法的递归
1.递归定义
简单来说,递归算是套娃。
从前有座山,山里有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚,老和尚正在给小和尚讲故事:…
除非老和尚不讲了,否则这个故事就一直套娃下去。
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
2.例题分析
举个例子:递归求 N 的阶乘
public static void main(String[] args) { int n = 5; int ret = factor(n); System.out.println("ret = " + ret); } public static int factor(int n) { System.out.println("函数开始, n = " + n); if (n == 1) { System.out.println("函数结束, n = 1 ret = 1"); return 1; }else{ int ret = n * factor(n - 1); System.out.println("函数结束, n = " + n + " ret = " + ret); return ret; } }
分析递归过程如下:
3.递归应用场景
递归算法一般用于解决三类问题:
- 数据的定义是按递归定义的。(Fibonacci函数)
- 问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
- 数据的结构形式是按递归定义的。如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
【注意】
虽然递归操作有很多的优点,但是缺点也很明显
- 使用递归实现需要函数压栈和弹栈的操作,所以程序的运行速度比不用递归实现要慢得多。如果操作不慎,还极易出现死循环,所以在使用递归一定要设置递归操作的终止条件。
下面给大家推荐递归的两个经典例题:
- 求斐波那契数列的第 N 项
- 求解汉诺塔问题(提示, 使用递归)
- 青蛙跳台阶问题(提示, 使用递归)
有兴趣的同学可以去自行尝试!
总结
最近在看《士兵突击》,迷惘了,希望能够找点东西激励自己。《士兵突击》在某种程度上,真的让我感悟良多。推荐大家去看看。
里面的台词让我受益良多。
“心稳了,手也就稳了”
“想到和得到之间还有两个字,就是做到”
各位,共勉了!
加载全部内容