黑马程序员技术交流社区

标题: 求解释一下输出顺序问题 [打印本页]

作者: 徐君    时间: 2013-11-18 18:25
标题: 求解释一下输出顺序问题
class StaticCode{
        static{
                System.out.println("A");
        }
        public void show(){
                System.out.println("show run");
        }
}
public class StaticCodeDemo {
        static{
                System.out.println("B");
        }
        public static void main(String[] args) {
                new StaticCode().show();
        }
        static{
                System.out.println("C");
        }

}
接果为嘛会是B C A。。
作者: zuiaichiyu    时间: 2013-11-18 18:39
public class StaticCodeDemo {
        static{
                System.out.println("B");
        }
        public static void main(String[] args) {
                new StaticCode().show();
        }
        static{
                System.out.println("C");
        }

}
java虚拟机运行时先加载StaticCodeDemo 类。
静态代码块随了类的加载而加载,用于对类进行初始化,
StaticCodeDemo 类中的两个静态代码块先后执行打印出BC
接着主函数执行 ,建立StaticCode对象,同样先执行StaticCode类中的静态代码块打印出A
接着show方法运行
作者: ″先森丶玹°    时间: 2013-11-18 18:44
static{
                System.out.println("B");
        }
static{
                System.out.println("C");
        }
static{
                System.out.println("A");
        }
这个叫静态代码块,是随着类的加载就加载,简单说就是优先主函数main执行。
当你new StaticCode().show(); 时,静态代码块就加载了,按顺序B C A 执行完之后才执行show(); 也就是 show run
作者: 段光宇    时间: 2013-11-18 18:47
1、程序开始时,首先去加载带有main函数的类,即首先加载主类StaticCodeDemo,主类中有两个static函数体,它们随着主类的加载而加载,所以首先输出B、C
2.执行完两个static函数,开始执行main函数,main函数里调用了StaticCode类中的show方法,首先要建立StaticCode类的对象,同样的,StaticCode类中有一个static函数体,随着对象的建立,这个函数体随着类的加载而加载,所以输出A
3、StaticCode类执行完一个static函数,开始执行show函数,输出show run。

就记住一点,static随着类的加载而加载,不用生成对象即可使用。
作者: Faner    时间: 2013-11-18 18:57
静态代码块 随着类的加载而同时加载   已加载 static{  System.out.println("B");    }  和static{
   System.out.println("C"); 就优先运行  故输出 B  C      虽然两句位置不在一起  但是StaticCodeDemo  已加载  她们都是优先加载的   然后再运行 new StaticCode().show();   这个new StaticCode() 已创建 匿名对象 就开始调用
class StaticCode   但是static{  System.out.println("A");    优先运行 故输出A   
作者: hurryup    时间: 2013-11-18 19:02
1.jvm在执行你这段代码时,首先找到主程序入口所在类,即public static void main()所在类,StaticCodeDemo,先把它加载到内存中,同时发现有静态代码块,就安代码先后顺序,随类的加载而加载并执行,所以会先打印B,后打印C.
2.主程序中,对类StaticCode初始化,并将其加载到内存中,首先先查看是否有静态代码块,有就先执行,那么就打印出C,最后调用了该对象的Show()方法。
作者: zdrain    时间: 2013-11-18 19:23
首先,static静态代码块用于类的初始化,类加载,它就运行,所以当javac的时候,主函数所在类的静态代码块就执行了,b c就打印了。

然后执行main函数里的内容。

new StaticCode的时候这个类加载进内存,所以这个类的静态代码块执行,打印A.

然后调用show方法,打印show run。

总之,执行顺序,静态代码块,显示初始化,构造代码块,构造函数,具体内容。这个好像得背下来
作者: 徐君    时间: 2013-11-18 21:14
哦哦,晓得了。。谢谢各位哈
作者: 默狼    时间: 2013-11-18 21:25
程序编译时会先加载主函数。而在运行的时候会先运行静态代码块的代码,然后是加载方法代码,调用方法里的show方法执行结果、
作者: FFF    时间: 2013-11-19 00:17
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2