class Demo1
{
int num=1;
String color="blue";
static
{
System.out.println("static");
}
public static void show(Demo1 d)
{
System.out.println(d.num);
}
public static void main(String args[])
{
Demo1 d=new Demo1();
show(d);
System.out.print("main");
}
static
{
System.out.println("end");
}
}
静态成员函数不能调用非静态成员变量。静态成员先于对象存在那在show()里面怎么可以调用d.num。谁能给说一下该代码在内存中从加载到运行时的顺序。

解决方案 »

  1.   

    static 
    end
    1
    main
    static 
    end
    是由于 该类为启动类,即 java Demo1
    所以jvm会主动使用 ,先加载 class ,然后初始化static模块的代码 ,顺序执行
    然后执行main函数
      

  2.   

    有时间看看圣思源的 jvm的那个视频教程 ,蛮好的 ,俺看过好几遍了 ,每次看过都会有收获
      

  3.   

    你说的我知道,你没明白我的意思,我想知道的是该函数在静态成员函数中调用了非静态成员
    public static void show(Demo1 d)
     {
     System.out.println(d.num);
     }
     静态成员函数不是优先于对象存在吗,在该函数被加载时 Demo1 d 并没有被创建,怎么能输出呢?
    还有如果有一个静态成员变量 static int x=1;
    它和show() main()加载的顺序是什么呢?
      

  4.   

    静态成员函数不是优先于对象存在吗,在该函数被加载时 Demo1 d 并没有被创建,怎么能输出呢?
    你掉用这个函数的时候不会传递一个对象吗
      

  5.   

    没看明白,你想问什么。调用show的时候, d 已经new出来了。还想怎么样呢
      

  6.   

    Demo1 d=new Demo1();
    show(d);
    d不是new 出来了吗
      

  7.   

    只要你明白对象初始化的顺序,其实就很简单了,对象在初始化的时候会先初始化static的变量,或者实行static块,这个根据上下文顺序来,然后是非static的部分