public class Tests {
   static int a=5;
   public static void main(String args[]){
   Tests t=new Tests();
   t=null;
   t.a=7;
   System.out.println(t.a);
   }
}
求解释,越详细越好

解决方案 »

  1.   

    先执行static int a=5;
    在执行方法体内的t.a=7;
    不应该是7么?
      

  2.   

    public class Tests {
         static int a=5;
      public static void main(String args[]){
         Tests t=new Tests();
         t=null;
         System.out.println(t.a); //这个结果是5,test对象为空后,不应该指向null吗?
         t.a=7;
         System.out.println(t.a);// 这个结果是7,为什么?
      }
    }
      

  3.   

    被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
    所以当你使用System.out.println(a)或者System.out.println(Tests.a)的话,估计就没有疑问了不知道有没有说清楚
      

  4.   

    静态属性,虽然用对象引用来获取它,但jvm是根据t的类型去取值的,而不是t所引用的对象
      

  5.   

    类的static属性是和类绑定(包括内存空间同一)的,而类的对象的内存是由堆内存分配的;不论类的对象存不存在,有没有分配内存,类的static属性都和它没关系!其实这条语句
    t.a=7;
    最好写为
    a=7;
      

  6.   

    这个静态属性最好用Test.a来表示,这样你就清楚了。