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

运行结果:

相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸4 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342736 小时前
Java实现离线身份证号码OCR识别
java·开发语言