Java入门基础学习笔记33——方法在计算机中的执行原理

方法在计算机中的执行

方法被调用的时候,是进入到栈内存中运行。方法的运行区域是在栈内存中。

栈的特点是:先进后出。push pop。

保证一个方法调用完另一个方法后,可以回来。

方法为什么要在栈中运行自己。

sum 执行到return语句,会得到返回值30,传给rs,然后sum方法就从栈中被清理掉。

然后再执行main方法,打印rs的结果,main方法执行完成,main也会从栈中被清理掉。

程序执行完成之后,栈里的方法都会被清理。

Java的参数传递机制:

java的参数传递机制都是:值传递。

实参:在方法内部定义的变量。

形参:定义方法时,所声明的参数。

基本类型的参数传递

所谓值传递:指的是传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本。

就是将实参变量的值拷贝一份出来,传递给形参。

java 复制代码
package cn.ensource.parameter;

public class MethodDemo1 {
    public static void main(String[] args) {
        // 目标:理解方法的参数传递机制:值传递
        int a = 10;
        change(a);
        System.out.println("main " + a);  // 10
    }

    public static void change(int a) {
        System.out.println("change1 " + a);   // 10
        a = 20;
        System.out.println("change2 " + a);   // 20
    }
}

change函数退出之后:

引用类型的参数传递:

数组:传递的是堆内存地址,相当于浅拷贝,那应该会互相影响的。

也是传递的地址,不过是地址的副本,也就是拷贝了一份给形参。

这是一节比较特殊的关键课程,必须要懂。

java 复制代码
package cn.ensource.parameter;

public class MethodDemo2 {
    public static void main(String[] args) {
        // 目标:引用类型的参数传递
        int[] arr = new int[]{10, 20,30};
        change(arr);
        System.out.println("main方法:" + arr[1]);
    }

    public static void change(int[] arr) {
        System.out.println("方法内1:" + arr[1]);
        arr[1] = 222;
        System.out.println("方法内2:" + arr[1]);
    }
}

运行结果:

可以看到最后arr1中的值为222。

change函数从栈中退出之后:

引用类型参数传递的相关案例:

数组的传递:

打印int类型的数组内容:

需求:

输出一个int类型的数组内容,要求输出格式为:11,22,33,44,55。

分析:

使用一个方法来解决需求。同时也是方便别人复用。功能都是以功能提供的。

1)方法是否需要接收数据进行处理?需要接收一个int类型的数组,因此形参声明为: int\[\] arr

2)方法是否需要返回数据呢?不需要,方法内部直接输出数组的内容,无需返回,因此返回类型声明为:void

3)在方法内部的业务:遍历数组,并输出相应的内容。

java 复制代码
package cn.ensource.parameter;

public class MethodCase1 {
    public static void main(String[] args) {
        // 目标:完成打印int类型的数组内容
        int[] arr = {10, 20, 30, 40, 50, 60, 70, 80, 90};
        // 打印数组
        printArray(arr);

        int[] arr2 = null;
        printArray(arr2);

        int[] arr3 = {};
        printArray(arr3);

    }

    /**
     *
     * @param arr
     */
    public static void printArray(int[] arr) {

        if (arr == null) {
            System.out.println(arr);
            return;
        }
        System.out.print("[");
        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("]");
    }
}

好的代码风格:层层拦截的风格。

运行结果:

该程序中,我们还使用三元运算符的方法。优雅专业的程序员的方法。

案例:比较两个int类型的数组是否一样。

需求:

如果两个int类型的数组,元素个数,对应元素的内容是一样的,我们就认为这两个数组是一样的。

1)方法是否需要接收数据进行处理?

需要接收两个int类型的数组,因此,形参声明为:int\[\] arr1, int\[\] arr2。

2)方法是否需要返回数据?

方法判断完需要返回:true和false。因此返回类型声明为boolean类型。

方法内部的业务:判断两个数组内容是否一样。

java 复制代码
package cn.ensource.parameter;

public class MethodCase2 {
    public static void main(String[] args) {
        // 目标:完成判断两个int类型数组是否一样
        int[] arr1 = {10, 20, 30, 40};
        int[] arr2 = {10, 20, 30, 40};

        System.out.println(equals(arr1, arr2));

    }

    public static boolean equals(int[] arr1, int[] arr2) {
        // arr1、arr2是否都是null
        if( arr1 == null && arr2 == null ) {
            return true;
        }

        if(arr1 == null || arr2 == null ) {
            return false;
        }

        if (arr1.length != arr2.length) {
            return false;
        }

        // 比较两个数组的内容是否一样
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;   // 两个数组是一样的。
    }
}

运行结果:

相关推荐
瑞克-桑切斯2 分钟前
真实企业场景 运维安全与管理
java·网络·github
老板一杯拿铁25 分钟前
Java 八股文面试详解:从基础到进阶的全面梳理
java·面试
const_qiu26 分钟前
第 2.5 章 2.5.4-2.5.5:JWT 双 Token 与声明式权限守卫
java·人工智能
bug菌28 分钟前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go
撸串-研究生28 分钟前
springboot福利院管理系统73979
java·spring boot·后端·福利院管理系统
不得了zz2 小时前
04-Spring AI Alibaba ReactAgent 生产级实践:工具调用、结构化输出、HITL 与上下文管理
java·ai编程·springaialibaba
猿究院_夏燊2 小时前
SpringMVC 到底是怎么干活的?
java·网络·职场和发展
鶴哥只手遮天2 小时前
Spring Framework 7.0.9 深度剖析-05-配置元数据解析:XML、注解与 JavaConfig
java·后端·开源
NGINX开源社区2 小时前
与我们交流:NGINX Gateway Fabric 与 NGINX Ingress Controller 社区会议
java·服务器·前端
鶴哥只手遮天2 小时前
Spring Framework 7.0.9 深度剖析-16-异步与调度
java·后端·开源