日期:2014-05-20 浏览次数:20759 次
class Base { static int a = 1; } class Sub extends Base { } class Simple { public static void main(String[] args) { Base b = new Base(); Sub s = new Sub(); System.out.println("s.a= "+s.a); s.a=2; System.out.println("b.a= "+b.a); System.out.println("s.a= "+s.a); } }
package test; class Student{ } class Base { static Student student = new Student(); } class Sub extends Base { } class StaticTest1 { public static void main(String[] args) { Base b = new Base(); Sub s = new Sub(); System.out.println("s.a= "+s.student);//对象的字符串表示形式 s.student=new Student(); System.out.println("b.a= "+b.student); System.out.println("s.a= "+s.student); } }
------解决方案--------------------
静态变量是属于类的,
在创建对象之间就已经存在,
不随着类的创建而被分配新的存储空间
------解决方案--------------------
其实楼主说的差不多,静态变量就只有一份拷贝。
------解决方案--------------------
之前楼上解释的都没错,我再补充一下:
搞清楚JVM的内存模型就会弄清楚各种作用域变量的存储方式:
使用new关键字的对象存储在heap区中,即所谓的堆。垃圾回收器针对的就是这个区域的对象进行回收。也是我们需要关注是否有内存泄露的关键点
局部变量即在函数中申明的变量存储在stack区中,即所谓的栈。方法结束了也就被自动回收了,所以局部变量无需关心是否存在内存泄露的问题。
静态变量或全局变量存储在JVM的全局数据区,所以是所有实例共享的。这样就能理解为什么static的变量在所有实例对象中总是只有一份拷贝的原因了
------解决方案--------------------
静态变量存储在 只有一份拷贝放在 data seg 里面 你s.a=2 已经修改了 a 的值 后面输出 的自然是2