java day10 内存分析(栈,栈帧,堆,方法区,常量池)

1、知识解析

1.1 栈

栈空间(stack),连续的存储空间,遵循后进先出的原则,用于存放局部变量(用完即删)

1.2 堆

堆空间(heap),不连续的空间,用于存放new出的对象,或者说是类的实例(new出来的对象),

1.3 方法区

方法区(method),方法区在堆空间内,用于存放①类的代码信息;②静态变量和方法;③常量池(字符串敞亮等,具有共享机制)字节码文件,static修饰的内容

2、例题解析

第一题:(具体解析看Demo01.java)

创建User.java

package Day10_Memory.Entity;

/**
 * @author wzy
 * @version 1.0
 * @date 0027 2020-11-27 9:40
 *
 * 实体类,需要实例化的对象所在的类
 */
public class User {
    private int id;
    private String name;

    public User(){

    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

创建ChangeUtils.java

package Day10_Memory.ChangUtils;

import Day10_Memory.Entity.User;

/**
 * @author wzy
 * @version 1.0
 * @date 0027 2020-11-27 10:25
 */
public class ChangeUtils {
    public static void change1(int num){
        int num1 = 10;
    }
    public static void change2(User user){
        user.setId(10);
    }

    public static void change3(User user){
        user=new User();
        user.setId(10);
    }

}

创建Demo01.java

package Day10_Memory.memory;

import Day10_Memory.Entity.User;

/**
 * @author wzy
 * @version 1.0
 * @date 0027 2020-11-27 9:42
 */

//  加载字节码文件  --在方法区
public class Demo01 {
    // 运行main方法  -- 在栈里的栈帧
    public static void main(String[] args) {
        //  实例化User对象(new User)
        //  同时在堆中开辟空间,拥有自己的属性和方法    --  (定义this.id=id;this.name=name,以及set、get方法、构造方法和toString方法)   --在堆中
        //  在栈帧中定义属性User user 并指向堆中开辟的空间(=)   --在栈里的栈帧
        User user = new User();  // 在堆中实例化User的对象,

        //  通过对象调用setId方法,传入参数1,赋值给堆的setId方法的形参name  -- public void setId(int id)
        //  把栈中的id值赋值给堆中的id属性(this.id=id;)
        //  方法结束后销毁栈中的局部变量id
        user.setId(1);

        //  通过对象调用setName方法,传入参数"张三",赋值给堆的setName方法的形参name ("张三"在方法区的常量池里定义,形参name是在栈中定义)  public void setName(String name)
        //  堆中对象里的name属性指向栈中的name属性,再指向常量池的"张三"
        //  方法结束后销毁栈中的局部变量name
        user.setName("张三");

        //  调用堆中对象的toString9()方法,打印对象信息
        System.out.println(user);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值