Java中内存结构分析:

 

1.栈:一般存放基本数据类型
2.堆:存放对象
3.方法区:常量池(常量,比如字符串),类加载信息(属性信息、方法信息)

创建对象流程的简单分析:

Person person = new Person();//创建对象
        person.name="jack";
        person.age=19;

(以下分析参考下面的图片)

1.先加载Person类信息(属性和方法信息,只会加载一次,在方法区中加载);
2.在堆中分配空间(new Person()创建了对象就会在堆中分配空间,如下图堆中的橙色空间),进行默认初始化(按规则来,一开始String类型的name初始化为null,int类型的age初始化为0);
3.把地址赋给person,person就指向对象(上一步完成后,会将堆中对象的内存地址赋给person,因此person只是引用了对象,不能说person就是对象);
4.进行指定初始化,比如person.name=“jack”;person.age=19

java中调用自身方法会造成卡顿吗_开发语言

 方法调用的内存机制分析:

1.当程序执行到方法时,就会开辟一个独立的空间(栈空间);
2.当方法执行完毕,或者执行到return语句就会返回;
3.返回到调用方法的地方,(如果方法还没执行完,返回后,则继续执行方法后面的代码),原方法的独立空间(栈空间)销毁释放;
4.当main方法(栈)执行完毕,整个程序退出

成员方法传参机制:

1.基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参。

以下方代码为例做分析:

import java.util.Scanner;

public class Main {
    //编写一个 main 方法
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
    //创建 AA 对象 名字 obj
        AA obj = new AA();
        obj.swap(a, b); //调用 swap
        System.out.println("main 方法 a=" + a + " b=" + b);
    }
}
class AA {
    public void swap(int a,int b){
        System.out.println("\na 和 b 交换前的值\na=" + a + "\tb=" + b);
   //完成了 a 和 b 的交换
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("\na 和 b 交换后的值\na=" + a + "\tb=" + b);
    }
}

java中调用自身方法会造成卡顿吗_jvm_02

 所以最后输出结果为:

java中调用自身方法会造成卡顿吗_开发语言_03

2. 引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参

(1)以下方代码为例做分析:

public class Main {
    //编写一个 main 方法
    public static void main(String[] args) {
//测试
        B b = new B();
        int[] arr = {1, 2, 3};
        b.test100(arr);//调用方法
        System.out.println(" main 的 arr 数组 ");
 //遍历数组
        for(int i = 0; i < arr.length; i++) {
               System.out.print(arr[i] + "\t");
             }
         System.out.println();
    }
}

class B {
    
    public void test100(int[] arr) {
        arr[0] = 200;//修改元素
//遍历数组
        System.out.println(" test100 的 arr 数组 ");
        for(int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }
}

java中调用自身方法会造成卡顿吗_开发语言_04

 所以最后输出的结果为:

java中调用自身方法会造成卡顿吗_jvm_05

(2)以下方代码为例做分析:

import java.util.Scanner;

public class Main {
    //编写一个 main 方法
    public static void main(String[] args) {
        B b = new B();
        Person p = new Person();
        p.name = "jack";
        p.age = 10;
        b.test200(p);
        System.out.println("main 的 p.age=" + p.age);
    }
}
class Person {
    String name;
    int age;
}
class B {
    public void test200(Person p) {
//p.age = 10000; //修改对象属性
//思考
        p = new Person();
        p.name = "tom";
        p.age = 99;
    }
}

java中调用自身方法会造成卡顿吗_System_06

 所以运行结果如下:

java中调用自身方法会造成卡顿吗_jvm_07