问题如下:
public class Test
{
static int a = 5;
public static void main(String[] args) 
{
Test t = new Test();
t = null;
System.out.println(t.a);
}
}
以上这段程序运行结果是:5。问题是t引用已经赋了null,t.a应该报告异常才对,为什么输出结果是5?
jdk版本:1.5_15,1.6_16运行结果一样都是:5

解决方案 »

  1.   

    变量a是类变量,与有没有生成Test的对象是无关的
    你的t.a其实编译时用的是:Test.a楼主看一下如下写法:((Test)null).a 也是正确的。没有用,直接使用Test.a就行了。
      

  2.   

    a是在Date segment存储着 t在栈类存存储 new 出来的t在 堆里面 然后 使t为Null,自然指向的new出来的t也为null 但是最后你打印的是静态成员变量a,t.a指向Date segment里面的a,你只是对a的一个引用 并没有改变a的值
      

  3.   

    虽然将t=null,但是t指向date segment还不是null,可以找到静态数据.是不是这样理解?
      

  4.   

    那是因为你输出的是t.a 
    其结果一定是5;
    若输出t;结果是null;
    不会出异常。
      

  5.   

    不要这样来理解(这种理解不好),变量a是属于类Test的变量,就是说,当类Test一装入内存,变量a的空间就在类Test的空间之中,因而随时都可以使用[通过类名Test.a],与有没有对象是无关的。
    而:t.a其实编译时用的是:Test.a 
      

  6.   

    static a 是类变量,无论你有没有Test类的实例,或者无论你有多少个Test类的实例 a只有一个而且必有一个