为什么需要学习方法?
1.简化了代码
2.提高了代码可读性
3.提高了代码可维护性
3.提高了代码可扩展性
4.让我们从方法的实现者转而成为了方法的调用者,指挥者,对于开发大型的项目提供了基础,
同时 方法 也是面向对象思想的基础
方法的概述:
从数学中抽象出来的概念: z = f(x,y); (函数)
完成特定功能的代码片段。
需求: 计算 m ~ n 的和?
方法的格式:
【访问权限修饰符】 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, …) 【throws 异常类名】 {
方法体;
【return 返回值】;
}
访问权限修饰符: 这里暂时使用 public static,后面讲解面向对象的时候详细介绍
返回值类型 : 这里的类型可以是八大基本数据类型和引用数据类型,这里的类型必须和返回值的类型保持一致(也可以满足 类型转换和多态转型)
如果一个方法没有返回值,那么这里书写 void关键字
方法名: 这里必须见名知意,满足驼峰命名法,一般是动词
参数类型: 这里的类型可以是八大基本数据类型和引用数据类型
形参: 方法定义时候的参数
实参: 方法调用时候的参数
这里的参数变量只能够在方法体内有效
参数名: 这里必须见名知意,满足驼峰命名法,一般是名词,其实就是变量,只不过在局部有效,又称为局部变量
throws 异常类名: 目前省略不写,后面讲解异常的时候详细介绍
方法体: 利用传入的参数共同完成特定功能的代码片段,注意方法是片段代码
return 返回值:
如果一个方法定义的时候声明了返回值类型,那么必须要指定返回值
如果一个方法定义的时候声明返回值类型为 void,那么这里可以不返回,也可以使用 return;
这里的返回值 满足 类型转换和多态转型
方法定义的位置: 主方法也是方法,给JVM调用执行,那么我们写的方法是自定义方法,由我们调用执行
主方法和自定义方法是平级关系
主方法定义在 类体以内
类体以内,方法体以外。
方法定义的三要素:
1.返回值类型 (结果)
2.参数列表 (原材料)
3.方法名 (供别人调用)
方法调用的三要素:
1.方法需要什么类型的数据就传什么类型
基本数据类型: 满足类型转换 【值传递】
引用类型: 【引用/地址 传递】 面向对象
类:
普通类: 传该类的对象/匿名对象
抽象类: 传该类的子类/子类匿名对象
接口
该接口的实现类/接口的实现类匿名对象
数组
传入对应数组即可
2.返回什么类型的值,必须使用什么类型接受
基本数据类型: 满足类型转换 【值传递】
引用类型: 后面介绍
3.调用方法的时候参数的个数,顺序,类型必须一一对应
方法调用的三种方式:
1.直接调用 应用场景: 一般针对返回值类型为void的情况使用
2.输出调用 应用场景: 一般针对带有返回值的并且返回的结果只使用一次的情况
3.赋值调用 应用场景: 一般针对带有返回值的并且返回的结果可以后续使用的情况
方法的注意事项:
1.方法不调用不会执行
2.输出调用必须指定方法的返回值
3.如果一个方法声明了返回值类型,必须指定返回值
方法的调用原理
1.方法的调用本质就是 方法压栈的过程,方法返回本质就是 方法弹栈的过程
2.方法调用结束后会释放内存空间
3.方法返回给调用者,在什么地方调用就返回给什么地方
4.不同的方法的局部变量仅在局部有效,方法调用结束,局部变量销毁
内存结构
栈区: 先进后出,类似于子弹夹, 压栈 弹栈 / 入栈 出栈
方法区 (代码区 、 永久区): 存放代码 、 方法 、 常量、 静态成员
为什么需要学习方法重载?
解决参数的个数,类型,顺序不一致,但是功能一致,方法名一致的重名问题的情况
方法重载: 发生在同一个类中,方法名相同,参数的个数,顺序,类型不同构成重载
特点:
1.发生同一个类中
2.方法名称相同 [参数列表不同]
3.参数的个数,顺序,类型不同
1和2 顺序不同
1和3个数不同
1和4类型不同
4.方法重载和返回值类型以及访问权限修饰符,异常声明无关
5.重载也是多态的一种表现形式 (后面讲解多态的时候详细介绍)
6.重载的精确性原则
递归
- 为什么需要学习递归?
生活中的案例:
1.遍历文件夹下面所有的文件
2.通讯录
3.层级菜单
4.求阶乘
5.斐波那契数列
6.求最大公约数
递归的概述: 方法自己调用自己本身
递归的特点:
1.必须存在方法
2.自己调用自己 (方法不能够嵌套定义,但是可以嵌套调用)
3.递归一般要有出口(如果没有出口,一定会出现死递归)
java.lang.StackOverflowError 栈内存溢出 ?
4.构造方法不能够递归 (后面讲解面向对象的时候讲解)
/*
* 通过递归来求5的阶乘
* 5! = 5 * 4 * 3 * 2 * 1
* 返回值类型 int
* 参数列表: int n
* 方法名: factorial
*
* 120
* 5*24
* 4*6
* 3*2
* 2*1
* 1
*/
public static long getFactorialByRecursion(int n) {
if (n <= 0) {
return 0;
}
// 确定出口
if (n == 1) {
return 1;
} else {
return n * getFactorialByRecursion(--n);
}
}
/*
* 递归求斐波那契数列
* 返回值类型: int
* 参数列表: int n
* 方法名: getFibonacci
*/
public static int getFibonacci(int n) {
if (n <= 0) {
return -1;
}
// 先确定出口
if (n == 1 || n == 2) {
return 1;
} else {
return getFibonacci(n-1) + getFibonacci(n - 2);
}
}
}