Java初接触 | 方法【内存图、参数传递机制、案例、方法重载】

175 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第15天

方法调用的内存图

方法的调用流程 – 内存图解

  • 方法没有被调用的时候,在方法区中的字节码文件中存放
  • 方法被调用的时候,需要进入到栈内存中运行

image.png

image.png

方法的参数传递机制

基本类型的参数传递

Java的参数传递机制:值传递

  • 在传输实参给方法的形参的时候,并不是传输实参变量本身, 而是传输实参变量中存储的值,这就是值传递。

注意:

  • 实参:如在方法内部定义的变量。
  • 形参:如在定义方法时,“()”中所声明的参数。

image.png

基本类型的参数传递 image.png

引用类型的参数传递

image.png

方法的参数传递案例

案例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。

image.png

分析:
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个数组是一模一样的。

image.png

请使用方法完成:能够判断任意两个整型数组是否一样,并返回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;
    }
}

方法重载

方法重载的形式、作用

方法重载:同一个类中,出现多个方法名称相同,但是形参列表是不同的,那么这些方法就是重载方法。

案例: image.png

方法重载的作用:
可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择,这是一种专业的代码设计。

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+"~~~");
}

方法重载的识别技巧

  • 只要是同一个类中,方法名称相同、形参列表不同,那么他们就是重载的方法,其他都不管!(如:修饰符,返回值类型都无所谓)
  • 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。

补充知识:单独使用return关键字

image.png