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]);
    }
}

运行结果:

可以看到最后arr[1]中的值为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;   // 两个数组是一样的。
    }
}

运行结果:

相关推荐
lingggggaaaa8 分钟前
小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇&数据库篇&MySQL&MSSQL&Oracle&自动化项目
java·数据库·windows·笔记·学习·安全·网络安全
迦蓝叶38 分钟前
JAiRouter v1.0.0 正式发布:企业级 AI 服务网关的开源解决方案
java·运维·人工智能·网关·spring·ai·开源
安卓开发者43 分钟前
鸿蒙NEXT应用接入快捷栏:一键直达,提升用户体验
java·harmonyos·ux
yudiandian20141 小时前
03 Eclipse 配置 JDK 环境
java·ide·eclipse
_码力全开_1 小时前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
陈一Tender1 小时前
JavaWeb后端实战(登录认证 & 令牌技术 & 拦截器 & 过滤器)
java·开发语言·spring boot·mysql
Camel卡蒙1 小时前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
孤廖1 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我123451 小时前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime