static修饰的属性在堆内存中如何存储?
static这个词应该都不陌生,但是用起来也是多种多样的,今天就来简单做些static关键字的记录。
我们直接来看下测试代码:
如上图所示 userName被static修饰,在创建2个不同对象分别进行赋值后并输出,输出的结果却是一样的。sex是没有被static修饰的属性,在2个不同的对象分别进行赋值并输出,结果是不同的。那么static究竟是怎么做到这一点的呢?我尝试画了下内存结构。
左边的方框是栈,创建的对象User1,User2按照先进后出的方式压进栈中,分别指向堆中不同的2个地址。地址中存放着没有被static修饰的属性和方法。而被static所修饰的属性和方法存放在单独的一个空间。所以不管哪个对象对static修饰的属性进行修改,其实都是改的同一个属性。也就导致了第二次对userName进行赋值将第一次的覆盖掉了。
另一方面,如果在静态方法中调用了非静态成员变量也会报错。
报一个"无法将一个static修饰的方法与非静态成员变量sex关联"的错,在我询问后得知,static修饰的内容在加载的时候最先被加载,此时还没有加载其他内容。所以这个static修饰的方法a在被加载的时候,非静态成员变量sex还没有被加载,那么就无法在方法中直接使用sex。正确的做法应该是new User_static().getSex();定义一个类的实例然后调用getSex方法来调用。