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

  

之前设计的如下图:

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

一个对象的内存图:

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

解释:

第一步:

第二步:

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

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

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

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

 

  

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

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

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

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

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

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值