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;   // 两个数组是一样的。
    }
}

运行结果:

相关推荐
守护者1706 分钟前
JAVA学习-练习试用Java实现“使用Arrays.toString方法将数组转换为字符串并打印出来”
java·学习
源码哥_博纳软云8 分钟前
JAVA同城服务场馆门店预约系统支持H5小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
禾高网络9 分钟前
租赁小程序成品|租赁系统搭建核心功能
java·人工智能·小程序
学会沉淀。15 分钟前
Docker学习
java·开发语言·学习
如若12316 分钟前
对文件内的文件名生成目录,方便查阅
java·前端·python
初晴~1 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
黑胡子大叔的小屋2 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark2 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
雷神乐乐2 小时前
Spring学习(一)——Sping-XML
java·学习·spring
小林coding3 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云