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

运行结果:

相关推荐
liu_chunhai7 分钟前
设计模式(3)builder
java·开发语言·设计模式
ya888g42 分钟前
GESP C++四级样题卷
java·c++·算法
【D'accumulation】1 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
小叶学C++1 小时前
【C++】类与对象(下)
java·开发语言·c++
2401_854391081 小时前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Cikiss1 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
wxin_VXbishe1 小时前
springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290
java·spring boot·python·spring·servlet·django·php
Cikiss1 小时前
微服务实战——平台属性
java·数据库·后端·微服务
无敌の星仔1 小时前
一个月学会Java 第2天 认识类与对象
java·开发语言
OEC小胖胖1 小时前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web