static成员在JVM中的存储

本文通过一个具体的示例,深入解析了Java中static关键字的作用及其实现原理,包括static字段如何被多个对象共享以及如何通过类名直接访问static成员。同时,文章还探讨了static字段在内存中的存放位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.这节是演示了为什么static修饰的字段/方法,创建该类下的所有对象可以共享的以及,证明直接使用类名来调用static成员的

package com.JAVABASIS6;
//创建人类这个类
class PersonStatic{
String name; //年龄
int age; //性别
//不属于某个对象,属于人类
static int totalNum = 5;
PersonStatic(String n,int a){
name = n;
age =a;
totalNum ++;
}

void die(){
totalNum –;
System.out.println(“去世”);
}
//只有人类才有毁灭,毁灭这个行为不属于某个人
static void destory(){
totalNum =0;
System.out.println(“人类毁灭”);
}
}
public class StaticDemo1 {
public static void main(String[] args){
System.out.println(PersonStatic.totalNum); //最开始totalNum输出为5
PersonStatic p1 = new PersonStatic(“will”,17);
System.out.println(p1.totalNum);//totalNum输出为6,使用p1.totalNum没错,但是会报感叹号,The static field PersonStatic.totalNum should be accessed in a static way;如果使用PersonStatic.totalNum就是真正正确的
PersonStatic p2 = new PersonStatic(“will”,17);
System.out.println(PersonStatic.totalNum);//totalNum输出为7
p2.die();
System.out.println(PersonStatic.totalNum); //输出为”去世,6”totalNum输出为6,
System.out.println(p2.totalNum);//totalNum输出为6,且通过对象p1和p2的调用可以发现,totalNum这个字段,是共享,每次调用后都会在前一次调用的结果再运算的。
p1.destory();//真正正确应该写成PersonStatic.destory,直接使用类名访问static成员
System.out.println(PersonStatic.totalNum); //输出为”人类毁灭,0”
}
}
//通过Xlad反编译工具,对StaticDemo1.class进行反编译得出的:如果没有使用类名.方法/字段,编译器会自行做优化处理,也从侧面证明是直接使用类名访问static成员
/**
package com.JAVABASIS6;

import java.io.PrintStream;

// Referenced classes of package com.JAVABASIS6:
// PersonStatic

public class StaticDemo1
{

public StaticDemo1()
{
}

public static void main(String args[])
{
System.out.println(PersonStatic.totalNum);
PersonStatic p1 = new PersonStatic(“will”, 17);
//原先是这样的,System.out.println(p1.totalNum);
System.out.println(PersonStatic.totalNum);
PersonStatic p2 = new PersonStatic(“will”, 17);
//原先是这样的System.out.println(p2.totalNum);
System.out.println(PersonStatic.totalNum);
//原先是这样的
PersonStatic.destory();
System.out.println(PersonStatic.totalNum);
}
}
*/
“`
2.内存分析
1.首先创建的totalNum字段是放在方法区,java首先加载方法区里面的(当需要用到的类就会在方法区加载),static创建的字段就放在这里,所以这就表明“随着类的加载而加载”的原因

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值