方法 方法的重载 递归

本文深入探讨了编程中方法的重要性,包括代码简化、提高可读性和可维护性,以及其在面向对象思想中的基础作用。详细解释了方法的格式、定义和调用,以及方法重载和递归的概念,强调了它们在解决特定编程问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么需要学习方法?
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);
		}
		
	}
}

面试题: 死递归和死循环的区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值