开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第15天
方法调用的内存图
方法的调用流程 – 内存图解
- 方法没有被调用的时候,在方法区中的字节码文件中存放
- 方法被调用的时候,需要进入到栈内存中运行
方法的参数传递机制
基本类型的参数传递
Java的参数传递机制:值传递
- 在传输实参给方法的形参的时候,并不是传输实参变量本身, 而是传输实参变量中存储的值,这就是值传递。
注意:
- 实参:如在方法内部定义的变量。
- 形参:如在定义方法时,“()”中所声明的参数。
基本类型的参数传递
引用类型的参数传递
方法的参数传递案例
案例1:打印数组内容
需求:
设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:
“该数组内容为:[11, 22, 33, 44, 55]”
分析:
1、定义一个方法,要求该方法能够接收数组,并输出数组内容。 ---> 需要参数吗?需要返回值类型申明吗?
2、定义一个静态初始化的数组,调用该方法,并传入该数组。
public static void main(String[] args) {
// 需求:定义方法,可以打印任意整型数组的内容:[12, 32, 23]
// 4、定义数组,再调用方法
int[] arr = {12, 32, 23};
printArray(arr);
System.out.println("-----------------");
int[] arr2 = {};
printArray(arr2);
System.out.println("-----------------");
int[] arr3 = null;
printArray(arr3);
}
/**
1、定义一个方法:参数:整型数组类型的变量 返回值类型申明:void
*/
public static void printArray(int[] arr){
if(arr != null){
// 2、把数组内容打印出来。
System.out.print("[");
// 3、开始遍历数组中的每个数据
for (int i = 0; i < arr.length; i++) {
// 如果发现是最后一个元素不加逗号
// if(i == arr.length - 1){
// System.out.print(arr[i]);
// }else {
// System.out.print(arr[i] + ", ");
// }
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");
}
System.out.println("]");
}else {
System.out.println("当前数组对象不存在,其地址是:null");
}
}
案例2:从数组中查询元素的索引返回
需求:
设计一个方法可以接收整型数组,和要查询的元素值;最终要返回元素在该数组中的索引,如果数组中不存在该元素则返回 -1。
分析:
1、定义方法,接收整型数组,查询的元素值,在方法体中完成元素查询的功能。---> 是否需要参数、返回值类型?
2、定义数组,调用该方法,并指定要搜索的元素值,得到返回的结果输出。
public static void main(String[] args) {
// 需求:从整型数组中查询某个数据的索引返回,不存在该数据返回-1
// 3、定义数组,调用方法
int[] arr = {11, 22, 33, 66, 87, 19};
int index = searchIndex(arr, 17);
System.out.println("您查询的数据的索引是:" + index);
}
/**
1、定义一个方法:参数接收数组,要查询的数据,返回值:整型
*/
public static int searchIndex(int[] arr, int data){
// 2、开始找出这个数据的索引
for (int i = 0; i < arr.length; i++) {
if(arr[i] == data){
return i;
}
}
return -1; // 查无此元素!
}
案例3:比较两个数组内容是否相等
需求:
如果两个数组的类型,元素个数,元素顺序和内容是一样的我们就认为这2个数组是一模一样的。
请使用方法完成:能够判断任意两个整型数组是否一样,并返回true或者false。
分析:
1、定义方法,接收2个整型数组,---> 是否需要参数、返回值类型?
2、在方法内部完成判断的逻辑,并返回布尔结果。
public static void main(String[] args) {
// 需求:比较任意2个整型数组的内容是否一样,一样返回true 反之
int[] arr1 = {10, 20, 30};
int[] arr2 = {10, 20, 30};
System.out.println(compare(arr1, arr2));
System.out.println("-------------------");
int[] arr3 = null;
int[] arr4 = {};
System.out.println(compare(arr3, arr4));
}
/**
1、定义一个方法:参数:接收2个整型数组,返回值类型:布尔类型
*/
public static boolean compare(int[] arr1, int[] arr2){
if(arr1 != null && arr2 != null){
// 2、判断2个数组的内容是一样的呢
if(arr1.length == arr2.length){
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]){
return false;
}
}
return true; // 是一样的!
}else {
return false;
}
}else {
return false;
}
}
方法重载
方法重载的形式、作用
方法重载:同一个类中,出现多个方法名称相同,但是形参列表是不同的,那么这些方法就是重载方法。
案例:
方法重载的作用:
可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择,这是一种专业的代码设计。
public static void main(String[] args) {
// 目标:识别方法重载的形式。并理解其调用流程,最后需要知道使用方法重载的好处。
fire();
fire("岛国");
fire("岛国", 1000);
}
public static void fire(){
fire("米国");
}
public static void fire(String location){
fire(location, 1);
}
public static void fire(String location, int number){
System.out.println("默认发射"+number+"枚武器给"+location+"~~~");
}
方法重载的识别技巧
- 只要是同一个类中,方法名称相同、形参列表不同,那么他们就是重载的方法,其他都不管!(如:修饰符,返回值类型都无所谓)
- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。