一、本节重点内容
- 掌握 方法的定义以及使用 ;
- 掌握 方法传参 ;
- 掌握 方法重载 ;
- **掌握 递归 **。
二、思维导图
三、方法的概念和使用
3.1 什么是 方法
** 简单来说,方法就是一个 代码的片段,类似于C语言里面的函数。即:把一个功能给抽象出来了,使其变成一个模块;只需要传递相应的参数,便可以调用相应的方法,便可以调用这个功能。**
** 那么,方法的存在具有哪些意义呢:**
- 能够模块化的组织代码(当代码规模比较复杂的时候);
- 做到代码被重复使用, 一份代码可以在多个位置使用;
- 让代码更好理解更简单;
- 直接调用现有方法开发, 不必重复造轮子。
3.2 方法的定义
3.2.1 语法格式
** 【说明】**
- 在Java里面,方法中 如果有返回值类型的话,那么方法体中一定要有返回值(并且与返回值类型相对应),否则会报错:
- 下面来列一个简单的例子:
** 【注意事项】**
- 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void;
- 方法名字:采用小驼峰命名 ;
- 形参列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开;
- 在java当中,方法必须写在类当中;方法不能嵌套定义(各方法是同级别的,但可以嵌套调用);没有方法声明一说(即:只要方法定义在类里面即可,与 main函数 的位置无关) 。
3.3 方法调用的执行过程
3.3.1 方法调用的过程
【注意】
- 定义方法的时候,不会执行方法的代码, 只有调用的时候才会执行;
- 一个方法可以被多次调用。
3.3.2 下面举例详细分析一下一个方法的执行过程
**【注意】Java中 从本质上来说,都是按值传递。 **
3.3.3 代码示例
实现 1! + 2! + 3! + 4! + 5! 的代码:
** 这一章我们已经正式的接触到了 方法,因此 我们需要把某一种特定的功能 写成一个模块了,这样就会更加方便。**
第一步:我们 写出一个数的阶乘的方法:
第二步:我们 把每一个数的阶乘 给加到一起:
第三步:可以调用以上方法来实现功能:
然后编译起来看结果:
3.4 形参与实参的关系(重要)
【说明】形参是实参的一份临时拷贝。
给看个图片:
曾经,在C语言中 是用交换函数swap来介绍 形参和实参的:
** 分析:**
** 在经过swap交换后,交换的只是 形参 里面的数值,而并没有交换 实参 里面的数值;按照C语言来说,要想实现交换实参里面的值,那么就需要 形参 接收的是地址;可是,Java没有 按址传递 的概念。**
** x、y是在main函数里面定义的,属于局部变量;局部变量在栈上开辟内存(一块特殊的内存空间),对于Java而言,栈上变量的地址是拿不到的。**
** 等到以后介绍到 类和对象 的内容,才可以对它进行操作(放在堆上的 都是对象,这个以后进行介绍)。**
3.5 有没有返回值的方法
方法的放回只有两种情况:有 或者 没有。
如果有,那么 返回值的类型 与 方法中要返回的类型 一一对应;
如果没有,那么 返回值的类型 需要变成 void,同时 方法中不能含有 return 。
那么如何判断方法到底需不需要返回值呢?
——其实很简单,就是来判断 这个方法在接下来的过程中到底有没有“搞事情”;一般情况下,最好都要把方法返回一个值出来(推荐)。
3.5.1 代码示例
3.6 方法的重载
3.6.1 方法重载的概念
在Java中,如果多个方法的方法名相同,但是参数列表不同,那么 就称这几个方法重载了。
代码示例:
public class TestDemo {
/**
* 实现两个整数相加的
* @param a
* @param b
* @return
*/
public static int add(int a,int b){
return a+b;
}
/**
* 实现3个整数相加的
* @param a
* @param b
* @param c
* @return
*/
public static int add(int a,int b,int c){
return a+b+c;
}
/**
* 实现3个小数相加的
* @param a
* @param b
* @param c
* @return
*/
public static double add(double a,double b,double c){
return a+b+c;
}
public static void main(String[] args) {
System.out.println(add(1, 2));
System.out.println(add(1, 2, 3));
System.out.println(add(1.1, 1.2, 1.3));
}
}
如上,三个方法就是重载的。
3.6.2 方法重载的要求
- 方法名必须相同;
- 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同) ;
- 与返回值类型是否相同无关 。
第一个和第二个条件很好理解,那么 我们就来具体介绍一下 第三个条件的意思:
** 由此可见,真正影响 方法重载的 是 方法名和参数列表,而 返回值是不会影响方法的重载的。**
** 上面实例中,虽然返回值是不同的,但是 方法名和参数列表相同,所以 IDEA仍然把它当做了同一个方法,所以就报错了。**
** 所以说,返回值 一样 或者 不一样,不能考虑 能不能重载;真正决定重载的,是方法名和参数列表。**
** 简单的来说,平时用IDEA敲代码的情况,它会自动出现 一些方法重载的提示(这个会在介绍数组的时候会有大量的方法重载)。**
3.6.3 方法签名
在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量。
但是为什么在类中 可以定义 方法名相同的方法呢?
这就涉及到了 方法签名的概念,方法签名即:经过编译器编译修改过之后方法最终的名字。
*具体方式为:方法全路径名+参数列表+返回值类型,***构成方法完整的名字。 **
代码示例:
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 字节码。
** 方法签名中的一些特殊符号说明:**
3.7 递归
** 在某些情况下,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了。**
3.7.1 递归的必要条件
- 自己调用自己;
- 有一个趋近于终止的条件(递归出口)。
** 【注意】写递归,需要提前推导它的一个递归公式。**
3.7.2 递归过程的具体代码分析实例
代码示例:
public class TestDemo {
public static void func(int n){
if(n==1){
System.out.println(n);
return;
}
func(n-1);
System.out.println(n);
}
public static void main(String[] args) {
func(5);
}
}
图示:
** 【说明】正是由于每一次递归 都执行了一半,都要保存一下线程,这才会出现栈溢出的原因。**
3.7.3 递归的练习习题
递归经典练习题
总结
这一话的需要知道的内容就这么多了,
下一篇博客打算分享一些递归的练习题,用来巩固一下所学的知识,同时也会“装备”到这篇博客上去;
当然啦如果铁铁们可以一键三连那就更棒了,特别特别感谢 ୧(๑•̀⌄•́๑)૭ 。
版权归原作者 星海可沉鱼 所有, 如有侵权,请联系我们删除。