【Static关键字】static修饰的属性和方法在堆内存中的存储

static修饰的属性在堆内存中如何存储?

static这个词应该都不陌生,但是用起来也是多种多样的,今天就来简单做些static关键字的记录。
我们直接来看下测试代码:

定义一个User类
User_static_test+测试
如上图所示 userName被static修饰,在创建2个不同对象分别进行赋值后并输出,输出的结果却是一样的。sex是没有被static修饰的属性,在2个不同的对象分别进行赋值并输出,结果是不同的。那么static究竟是怎么做到这一点的呢?我尝试画了下内存结构。
static在内存中的位置
左边的方框是栈,创建的对象User1,User2按照先进后出的方式压进栈中,分别指向堆中不同的2个地址。地址中存放着没有被static修饰的属性和方法。而被static所修饰的属性和方法存放在单独的一个空间。所以不管哪个对象对static修饰的属性进行修改,其实都是改的同一个属性。也就导致了第二次对userName进行赋值将第一次的覆盖掉了。

另一方面,如果在静态方法中调用了非静态成员变量也会报错。
在这里插入图片描述
在这里插入图片描述
报一个"无法将一个static修饰的方法与非静态成员变量sex关联"的错,在我询问后得知,static修饰的内容在加载的时候最先被加载,此时还没有加载其他内容。所以这个static修饰的方法a在被加载的时候,非静态成员变量sex还没有被加载,那么就无法在方法中直接使用sex。正确的做法应该是new User_static().getSex();定义一个类的实例然后调用getSex方法来调用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值