之前设计的如下图:
方法区和内存在物理上是一块的,但是有不好的地方,所以变成了这种形式:
一个对象的内存图:
在创建对象时虚拟机至少做了以下七步:
解释:
第一步:
第二步:
1、加载class文件
2、声明局部变量:
3、在堆中开辟一个空间
4、默认初始化
5、显示初始化
如果代码这样写的,则显式初始化就是在默认初始值的时候null和0就会被张三和23所覆盖
但是这样写:并没有赋值,则显示初始化可以忽略
6、构造方法初始化
此时写的是无参构造,而且空参构造中也没有写代码,,则构造初始化可以忽略
但是如果代码是有参构造,则name和age就会有值
7、
s也可以通过001找到空间的地址
第三步:
第四步:
第五步:
第六步:
当study方法执行结束后就从栈退出,整个main方法也执行完毕退出栈,创建的变量也消失了,则没有变量指向了堆里面的空间,这个空间也会消失。
两个对象的内存图:
与一个对象的内存图一样,但是需要注意的是,.class文件不需要再加载一次
两个引用指向同一个对象:
出现空指针异常
将stu1=null注释后,下一行代码stu2是指向001的,所以下一行代码仍可以输出阿珍
此时stu2指向的001也断开了,此时堆里面的空间没有变量指向,就会变成垃圾,栈内方法也会退出:
基本数据类型和引用数据类型:
this内存原理:
举例1、
举例2、
接下来调用set方法去赋值:
setName进栈
将竹小玲赋值给001里面的name
执行完之后,可出栈,再去执行第二个:
成员变量和局部变量的区别:
形参也是局部变量,下图所指的方法声明上就是指的形参:
全局变量和成员变量不是一个东西。
全局变量是在整个程序中都可见和访问的变量,它在程序开始执行时被创建,在程序结束时被销毁。全局变量可以在任何函数或方法中使用。
成员变量是在类中声明的变量,它属于类的实例(对象),每个对象都有自己的一份成员变量,它在对象创建时被创建,在对象销毁时被销毁。成员变量只能在类的方法中使用。
因此,全局变量是在整个程序中都可见和访问的变量,而成员变量是属于类的实例(对象)的变量。
全局变量存储在程序的全局数据区中。在程序运行时,全局变量的内存空间会被分配在全局数据区,并且在整个程序的执行过程中都可以使用。全局数据区在程序加载到内存中时就被分配好,并且在程序结束时被释放。全局变量的作用域是整个程序,可以在任何函数或代码块中访问。