Java 面向对象 06 对象内存图(黑马)

发布时间:2024年01月21日

??

之前设计的如下图:

方法区和内存在物理上是一块的,但是有不好的地方,所以变成了这种形式:

一个对象的内存图:

在创建对象时虚拟机至少做了以下七步:

解释:

第一步:

第二步:

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

执行完之后,可出栈,再去执行第二个:

成员变量和局部变量的区别:

形参也是局部变量,下图所指的方法声明上就是指的形参:

?

??

全局变量和成员变量不是一个东西。

全局变量是在整个程序中都可见和访问的变量,它在程序开始执行时被创建,在程序结束时被销毁。全局变量可以在任何函数或方法中使用。

成员变量是在类中声明的变量,它属于类的实例(对象),每个对象都有自己的一份成员变量,它在对象创建时被创建,在对象销毁时被销毁。成员变量只能在类的方法中使用。

因此,全局变量是在整个程序中都可见和访问的变量,而成员变量是属于类的实例(对象)的变量。

全局变量存储在程序的全局数据区中。在程序运行时,全局变量的内存空间会被分配在全局数据区,并且在整个程序的执行过程中都可以使用。全局数据区在程序加载到内存中时就被分配好,并且在程序结束时被释放。全局变量的作用域是整个程序,可以在任何函数或代码块中访问。

文章来源:https://blog.csdn.net/qq_53390480/article/details/135734624
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。