方法
Method can be used to define reusable code as well as organize and simplify code.
方法组成
[modifier] [return-type-value] [method-name](parameters...){
[method body]
}
方法实际组成


方法调用的过程:
当一个被调用的时候,系统会为其创建一个活动记录即调用堆栈,该调用堆栈(call stack)会保存该方法所需要的参数和变量。当一个方法调用另一个方法时,调用者的活动记录保持不同,一个新的活动记录被创建用于新方法。一个方法结束返回调用者时,其相应的活动记录也会被释放!
例题: (出错的地方❌)
public class TestDemo {
public static void main(String [] args){
int i = 0;
while(i <= 4){
method1(i);
i++;
}
}
private static void method1(int i){
do{
if(i % 3 != 0){
System.out.print(i + "");
}
i --;
}while(i >= 1);
System.out.println();
}
}
// 输出
// 1
// 2 1
// 2 1
// 4 2 1
0 % 3 = 0;
3 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
4 % 3 = 1;
模块化代码
🟡模块化代码使得代码易于维护(maintenance)和调试,提高代码重用性,降低冗余度,提高代码质量。
/**
* @Description: 将十六进制转换成十进制
* @Author: Wangzz
* @Version: 1.0.0
* @CreateDate: Created in 2021/3/25 20:41
* @UpdateDate: [dateFormat:YYYY-MM-DD][modifier][description]
*/
public class ConversionUtil {
public static void main(String [] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入16进制数:");
String hexStr = bf.readLine();
System.out.println("十六进制:" + hexStr + " 对应的十进制数是: " + hexToDecimal(hexStr));
}
private static int hexToDecimal(String hex){
String[] hexStrArr = hex.split("");
int sum = 0;
for(int i = 0; i <= (hexStrArr.length - 1); i++){
if(hexToDecimalKit(hexStrArr[i]) == -1){
sum += Integer.parseInt(hexStrArr[i]) * Math.pow(16, (hexStrArr.length - 1 - i));
}else{
sum += hexToDecimalKit(hexStrArr[i]) * Math.pow(16, (hexStrArr.length - 1 - i));
}
}
return sum;
}
private static int hexToDecimalKit(String str){
switch(str){
case "A": return 10;
case "B": return 11;
case "C": return 12;
case "D": return 13;
case "E": return 14;
default:
return -1;
}
}
}
// ========== 输出: ==========
请输入16进制数:
AB8C
十六进制:AB8C 对应的十进制数是: 43916
重载方法
🔑重载方法(overloading) : 要求以同样的名字来定义不同的方法但是各个方法的方法签名(method signature)各不相同
方法签名不同: 1.参数类型不同 2.参数个数不同 3.参数顺序不同
重载简单的说就是多个具有相同名称的方法用来接收不同的消息输出不同的处理结果。(宏观上功能相同微观上处理细节不同)
重载方法好处: 执行同样功能但是具有不同参数类型的方法应该使用同样的名字。
🥎避免歧义调用(ambiguous invocation),歧义调用会产生一个编译错误!


变量的作用域(scope of a variable) - 变量可以在程序中引用的范围
🎽局部变量(local variable) - 从定义开始到包含该局部变量的块结束为止。
局部变量的作用域是从声明变量的地方开始,直到包含该变量的块结束为止📍
🧶局部变量在使用之前必须进行提前声明和赋值
参数实际上就是一个局部变量 eg: max(int num) num就是一个局部变量在max(int num)引用之前
就会传入实际参数(actual parameter) 这样就符合【声明+赋值】的完成。
一个方法的参数的作用域覆盖整个方法。

👨🏻💻可以在一个方法中的不同块里声明同名的局部变量,但是不能再嵌套块中或同一块中两次声明同一个局部变量

总结:
什么是局部变量: 在方法内声明的变量(记住:该变量使用之前一定要赋值,也就是说局部变量在使用之前声明和赋值必须完成)
局部变量的作用域(scope of variable): 从局部变量声明开始到包含该变量块结束为止📍。
方法抽象和逐步求精 - [Methods Abstract and step by step refinement]
The key to developing software is to apply abstract concepts.
开发软件的关键是如何运用【抽象】概念 =》 【自顶向下分析】 + 【自低向上构建】
方法抽象(method abstract) 是通过将方法的使用和方法的实现分离开来实现的。
即用户在不知道方法如何实现的情况下,就可以使用方法。
方法实现的细节被封装在方法内,对使用该方法的用户来说是隐藏的(信息隐藏 - information hiding)或封装(encapsulation)
如果决定改变方法的实现,但只要不改变方法签名,用户的程序就不会受到影响。
方法的实现对用户隐藏在”黑盒子“之中
方法抽象的概念在于应用于程序的开发过程之中。
eg:
当需要编写要给大程序的时候,可以使用分而治之 - Divide And Conquer的思想和逐步求精 - Step-wise Refinement, 将大问题分解为小问题。小问题又被分解为更小、更容易处理的问题。
关键术语 - Key Terms
| 成功 | 约等于 | 坚持 | 少说废话 |
|---|---|---|---|
| actual parameter(实际参数) | argument(实参) | ambiguous invocation(歧义调用) | divide and conquer(分而治之) |
| formal parameter(形式参数) | modifer(修饰符) | information hiding(信息隐藏) | pass-by-value(按栈值传递) |
| method abstraction(方法抽象) | scope of variable(变量的作用域) | method overloading(方法重载) | stepwise refinement(逐步求精) |
| method signature(方法签名) | stub(n. 存根、树桩、待完善的东西) | Top-down design(自顶而下设计) | guard clauses(卫语句) |
小结(Summary)
- 实际参数和形式参数要具有类型、属性、个数上的同一。
- Java之中,带有返回值的方法可以当作语句调用(调用函数只要忽略返回值即可)。
- 方法抽象是把方法的应用和实现分离。用户可以在不知道方法是如何实现的情况下使用方法。方法的实现细节封装在方法内,对调用该方法的用户隐藏(亦称为信息隐藏-information hiding)
- 方法抽象将程序模块化为整齐、层次分明的形式。将程序写成简洁的方法构成的集合会比其他方式更容易编写、调试、维护和修改。
- 方法抽象 = 【自顶向下分析设计】 + 【自低向上构建实现】

浙公网安备 33010602011771号