java 静态变量

小鱼人爱编程 2016-11-03 09:31:04

public class TestStatic {
public static void main(String args[]){
System.out.println("Hello");

TestA.posA.a = 5;
TestA.posB.a = 6;
System.out.println("Test.a:"+TestA.posA.a);
}

}

class Pos{
static int a;
static int b;
}
class TestA{
public static Pos posA;
public static Pos posB;
}

输出怎么是6,为什么会覆盖呢。
...全文
176 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
小鱼人爱编程 2016-11-05
  • 打赏
  • 举报
回复
懂了,感谢各位。
bigbaldy 2016-11-04
  • 打赏
  • 举报
回复
本来就是一个变量啊,怎么会不是6呢?
  • 打赏
  • 举报
回复
这是main方法的字节码 0: getstatic #2 // Field java/lang/System.out:Ljav a/io/PrintStream; 3: ldc #3 // String Hello 5: invokevirtual #4 // Method java/io/PrintStream.prin tln:(Ljava/lang/String;)V 8: getstatic #5 // Field TestA.posA:LPos; 11: pop 12: iconst_5 13: putstatic #6 // Field Pos.a:I 16: getstatic #7 // Field TestA.posB:LPos; 19: pop 20: bipush 6 22: putstatic #6 // Field Pos.a:I 25: getstatic #2 // Field java/lang/System.out:Ljav a/io/PrintStream; 28: new #8 // class java/lang/StringBuilder 31: dup 32: invokespecial #9 // Method java/lang/StringBuilder. "<init>":()V 35: ldc #10 // String Test.a: 37: invokevirtual #11 // Method java/lang/StringBuilder. append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 40: getstatic #5 // Field TestA.posA:LPos; 43: pop 44: getstatic #6 // Field Pos.a:I 47: invokevirtual #12 // Method java/lang/StringBuilder. append:(I)Ljava/lang/StringBuilder; //你会发现其实System.out.println("Test.a:"+TestA.posA.a);这句话输出的值其实是获取的 Pos.a的值,如果从内存分析的话,静态变量存放在class对象中,每个类加载器加载的同一个类只有一个class对象,所以是修改的是同一个静态变量的值 50: invokevirtual #13 // Method java/lang/StringBuilder. toString:()Ljava/lang/String; 53: invokevirtual #4 // Method java/io/PrintStream.prin tln:(Ljava/lang/String;)V 56: return
编程周记 2016-11-03
  • 打赏
  • 举报
回复
哈哈
编程周记 2016-11-03
  • 打赏
  • 举报
回复
那我反问你,为什么会是5呢?

50,503

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧