java基础 —— 方法执行内存分析+方法重载+方法递归

目录

    • 一、方法
    • 二、JVM(java虚拟机)
    • 三、方法重载(Overload)
    • 四、方法递归(实际上就是入栈出栈的过程)

一、方法

  1. 方法调用: 类名.方法名(实参)
  2. .方法定义在类中,一个类中可以定义多种方法,但是方法体内不能够再定义方法。
  3. 方法只定义不调用是不会执行的,并且在JVM(java虚拟机)中也不会给该方法分配“运行所属”的内存空间,只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间。
    4.一个方法有返回值的时候,调用此方法可以接收返回值也可以不接收返回值,但是一般情况下是接收返回值的。

二、JVM(java虚拟机)

Java虚拟机主要包括三块内存空间:方法区内存堆内存栈内存
(1)方法区内存:存储代码片段(方法代码片段属于.class字节码文件的一部分,在类加载的时候,JVM将它放在了方法区当中,所以JVM三块主要的内存空间中方法区内存最先有数据,存放了代码片段

(2)栈内存:分配方法运行的所属内存空间
java基础 —— 方法执行内存分析+方法重载+方法递归_第1张图片
①栈帧永远指向栈顶元素
②栈顶元素永远处于活跃状态,其它元素静止
③术语: 压栈/入栈/push —— 弹栈/出栈/pop

(3)画图表示虚拟机处理代码的过程

public class Test4 {
     
    public static void main(String[] args){
     
        int a=1;
        m(a);
        System.out.println(a);
    }

    private static int m(int b) {
     
        b++;
        return b;
    }
}

java基础 —— 方法执行内存分析+方法重载+方法递归_第2张图片

三、方法重载(Overload)

对待功能相似的方法名定义一样
(1) 方法重载条件①在一个类中②方法名相同③参数列表不同④类型不同
(2) 方法重载只和方法名参数类型有关

public class Test1 {
     
    public  static void main(String[] args){
     
        m(10);
        m('1');
        m(10.0);
    }
    private static int m(int a){
     
        System.out.println(a);
        return a;
    }
    private static double m(double a){
     
        System.out.println(a);
        return a;
    }
    private static  char m(char a){
     
        System.out.println(a);
        return a;
    }
}

四、方法递归(实际上就是入栈出栈的过程)

(1)递归就是方法自身调用自身
(2)递归十分占内存,能不用则不用
(3)Error:java.lang.StackOverflowError 栈内存溢出错误
错误无法返回,只有一个结果,就是JVM停止工作
(4)递归必须有结束条件,否则一定会发生栈内存溢出错误。递归即使有了争取的结束条件,也可能发生栈内存溢出错误,因为递归的太深了。

举例:计算1-N的乘积

普通方法

public class Test2 {
     
    public  static void main(String[] args) {
     
        System.out.println("请输入您要计算到的N:");
        Scanner s =new Scanner(System.in);
        int n=s.nextInt();

        int result = 1;
        for(int i=1;i<=n;i++){
     
            result *= i;
        }
        System.out.println("1-N的乘积为"+result);
    }
}

采用递归方法(面试题经常问到

public class Test3 {
     
    public  static void main(String[] args) {
     
        System.out.println("请输入您要计算到的N:");
        Scanner s =new Scanner(System.in);
        int n=s.nextInt();
        int result=m(n);
        System.out.println(result);
    }

    private static int m(int n) {
     
        if(n==1){
     
            return 1;
        }
        return n*m(n-1);
    }
}

你可能感兴趣的:(java基础,java,算法,栈)