目录
两个(多个)对象内存图(多个对象使用的是同一个字节码文件,使用的就是同一份方法,但是成员变量不同,每个对象的成员变量在堆内存都有独立的空间)
学习导图
单个对象内存图
一、有这样一段代码:
二、JVM有三块内存区
三、两个类被编译为字节码文件加载进方法区,TestStudent中的主方法所在类的字节码文件会先加载进方法区(因为main方法是程序的入口)
四、此次方法区中有什么方法就看源文件中有啥方法,源文件中只有main方法,则Teststudent字节码文件所在的方法区中也有main方法
五、主方法会被JVM虚拟机自动调用执行,会压入栈内存中,开始执行主方法中的代码
六、 执行第一行代码Student s = new Student();此时声明一个Student对象但是内存中没有Student对象的内存地址,需要将Student.class字节码文件加载进方法区
七、new Student()需要在堆内存中开辟一个空间,生产Student对象
八、对象是根据类创建的,所以类中的成员变量,在堆内存中也有一份并且拥有初始化值(Student对象存在于堆内存,其属性肯定在堆内存中也有一份),而成员方法不会进入堆内存,但是在堆内存中有一份成员方法的地址。
九、创建对象s完成,堆内存中地址为001,再将001赋值给s,此时控制台打印001地址
十、执行到s.study()方法时,就会在堆内存中找到s对应的地址001,在根据成员方法的地址值,找到Student.clss字节码文件中的study()方法,然后将study()方法加载进栈内存中
执行完study()方法中的代码后,study()方法会弹出栈内存,然后主方法弹栈程序执行完毕。
两个(多个)对象内存图(多个对象使用的是同一个字节码文件,使用的就是同一份方法,但是成员变量不同,每个对象的成员变量在堆内存都有独立的空间)
不会再加载一次
题目:执行如下代码输出的结果为:
class Student{
String name;
int age;
public void study(){
System.out.println("好好学习!");
}
}
public class TestStudent {
public static void main(String[] args) {
Student stu1 =new Student();
stu1.name = "阿强";
Student stu2= stu1;
stu2.name ="阿珍";
System.out.println(stu1.name+"..."+stu2.name);
stu1 = null;
System.out.println(stu1.name+"..."+stu2.name);
stu2=null;
System.out.println(stu1.name+"..."+stu2.name);
}
}
A.
阿强...阿珍
NullPointerException
B.
阿珍...阿珍
NullPointerException
NullPointerException
C.
阿强...阿珍
null...阿珍
null...null
D.
阿珍...阿珍
NullPointerException
垃圾回收
注意:当堆内存中,对象或者数组产生的地址,通过任何方式都不能被找到后,就会被判定为内存中的“垃圾”,垃圾会被Java垃圾回收器,空闲的时候自动进行清理
成员变量与局部变量
this关键字
this:代表所在类的对象引用,方法被哪个对象调用
封装:
构造方法