第六章
6.1引言
方法可以用于定义可重用的代码以及组织和简化编码
6.2 定义方法
修饰符 返回值类型 方法名(参数列表){
//方法体
}
方法头:指的是方法的修饰符+返回值类型+方法名+参数列表
修饰符:目前为止,暂时只使用static当作方法参数
返回值类型:方法有返回值(需要输出的值),那就填写其返回(需要输出)的数据类型;方法没有返回值,直接填写void
方法名:方法名和参数列表一起构成方法签名
参数列表:
参数列表指明参数的类型、顺序和个数,也可以没有参数。
需要对每一个参数单独声明数据类型,不可以直接敲int a, b, c = 1;
定义在方法头中的参数被称为形参,使用真实的数据调用形参时,该数据被称为实参
方法体:是一个执行方法的语句合集。为了让带有返回值的方法可以打印出一个结果,必须使用return关键字,执行return后方法终止
6.3 调用方法
调用方法就是执行方法中的代码
当程序调用一个方法时,程序控制就转移到被调用的方法。当执行完 return语句或执行到表示方法结束的右括号时,被调用的方法将程序控制返还。
当尝试调用一个方法时,系统会生成一个活动记录/活动框架,该记录储存在堆栈中,堆栈是内存的一部分。
方法结束时,堆栈的活动记录也会被释放/销毁(也包括入口main方法)
6.4 void方法示例
void方法没有返回值,通常用system.out.println();来表示,调用void方法必须使用1条语句。
其实,void方法可以使用return,直接终止方法并将程序控制返还。使用return可以在方法调用出现预期之外的运行时错误、逻辑错误等时直接终止方法运行。
6.5 通过传值进行参数传递
调用带参数的方法时,将实参的值传递给形参;如果实参是变量,就将变量的值传递给形参
无论形参在方法内部是否改变,外部实参的值都永远不受影响,因为形参有自己独立于实参的储存空间
6.6 模块化代码
模块化代码就是将相关功能代码封装在一个方法中,调用者不关心方法内部究竟是如何实现的
模块化代码有2个优点
- 易于调试和维护。模块化代码把核心方法和main方法代码进行了分隔,如果计算出错,那么bug也就局限在方法内部,这会使逻辑更加清晰,可读性更强,调试范围更小
- 便于代码复用,其他的程序也可以直接使用该核心方法
6.7 示例学习:将十六进制数转换为十进制数
6.8 重载方法
方法头中,只有参数列表不同的方法被称为方法重载
如果定义了(int a, int b)和(double a, double b)两个重载的方法
- 使用(3, 4.5)依然可以匹配到第二个方法,原因是int被转型为double了
- 使用(3, 4)会调用第一个方法,虽然两个方法都可以匹配,但是方法一更佳精确,会优先匹配更加精确的方法
如果定义了(int a, double b)和(double a, int b)两个重载的方法
使用(1, 2)进行调用会导致编译错误,因为编译器无法判断哪个是最精确的匹配
6.9 变量的作用域
在方法中定义的变量就是局部变量,局部变量的作用域从定义处开始,一直到包含该变量的块结束为止
方法参数实际上就是局部变量
只要作用域不同,就可以在一个方法内不同的块内定义同名的局部变量
6.10 示例学习:生成随机字符
6.11 方法抽象和逐步求精
方法抽象是指,通过将方法用封装/信息隐藏的方式,用户在不知道方法是如何实现的情况下,就可以调用该方法
逐步求精或分治是指,将大问题逐步分析化解为小问题,编程时也要从程序框架逐渐写出完整的程序,使程序更加容易阅读,更加易于调试测试,更加方便团队协作(可以将每一个子问题分配不同成员,去调试,去合作)