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);
}
}