黑马程序员技术交流社区

标题: 程序加载问题 [打印本页]

作者: Tesla时光    时间: 2012-9-10 22:51
标题: 程序加载问题
本帖最后由 翁发达 于 2012-9-11 12:13 编辑

为什么下面代码结果不是:  B C A D A D E?谁能帮我分析下?
class A{
        static{
                System.out.println("A");
        }
        {
                System.out.println("D");
        }
}

public class Test{

        static{System.out.println("B");}

        public static void main(String[] args) {
                new A();
                new A();
                System.out.println("E");
        }
        static{System.out.println("C");}
}

作者: 王金科    时间: 2012-9-10 23:56
这段代码执行的时候,首先主函数的  static{System.out.println("B");} 会执行,打印B
然后 执行static{System.out.println("C");} 打印C
接着执行 第一个new A(); 这是会加载类A,会先执行static{System.out.println("A");},打印A,然后执行 System.out.println("D");  打印D,
接着执行第二个 new A(); ,这是只会执行 System.out.println("D");   打印D
最后执行 System.out.println("E");  打印E, 所以正确的结果是 BCADDE

这里需要注意的是 类A里面的的静态代码块只执行一次,所以只打印了一次A
(静态代码块是给类初始化的,当类被加载到内存时,就会执行,而且只执行一次)
作者: 黑马-李勇    时间: 2012-9-10 23:57
结果是:
B
C
A
D
D
E

前的的static,结果一定是b,c,a
楼主只是不明白后面为什么是dde。

static代码块,随着类的加载而加载,而且只执行一次。再次调用方法是不会执行的。

未命名.JPG (37.84 KB, 下载次数: 27)

未命名.JPG

作者: 影子木木    时间: 2012-9-11 00:00
static代码块只能加载一次, 你new 了两个A()也只会执行一次System.out.println("A");
所以顺序就为  B C A D D E
作者: 王得新    时间: 2012-9-11 00:04
本帖最后由 王得新 于 2012-9-11 00:09 编辑

先明白2个问题:
静态代码块:
        主要为静态属性初始化,优先于主方法(main)执行,优先于构造方法的执行,而且只执行一次
构造代码块(又叫非静态代码块):
        给对象进行初始化,对象一建立就运行,而且优先于构造函数执行。

class A{
        static{
                System.out.println("A");
        }
        {
                System.out.println("D");
        }
}

public class Test{

        static{System.out.println("B");}//   1.静态代码块优先于主方法---------->"B"

        public static void main(String[] args) {
                new A();//3. 一new就会调用A类,一进入A类就会先看有木有静态代码块,有!就执行,所以是--------------->"A",记住静态代码块只执行一次

                              //4.接着是构造代码块(非静态代码块)------------->"D",接着是构造函数,没有就不执行。

                new A();//5. 再一次new,就会再进入A类(就是步骤3,但是静态代码块已经执行,所以不输出 -------->"A")

                             //6.接着是构造代码块(非静态代码块)------------------>"D",接着是构造函数,没有就不执行。
                System.out.println("E");
        }
        static{System.out.println("C");} //2.静态代码块优先于主方法-------------->"C"
}
所以结果是B C A D D E

最后总结下:
子类和父类中的静态代码块、构造代码块(非静态代码块)、构造函数之间的执行顺序
1.当在main主函数中看到new   Son()时;
2. 就会先---------------->进入Father类,看有木有静态代码,有就执行,没有就不执行,这时的Father类中有构造代码块(非静态代码块)和构造函数都统统的先放放
3.不管父类的静态代码块执行否,都要回到Son中,看是否也有静态代码块,有就执行。没有就再回到Father类中
4.这时,看Father类中是否有构造代码块(非静态代码块),有就执行,执行后在执行父类的构造函数,执行完后再回到Son中
5.这时,再看Son类中是否有构造代码块(非静态代码块),有就执行,然后在执行Son类中的构造函数

作者: 王陶成    时间: 2012-9-11 00:45
class A{
        static{
                System.out.println("A");
        }
        {
                System.out.println("D");
        }
}

public class Test{

        static{System.out.println("B");}1.加载Test类首先加载静态代码块,静态代码块是在类加载时被创建并进行初始化,类加载的过程只进行一次,也就是类变量只会被创建一次。

        public static void main(String[] args) {
                new A();3.实例化A类,先加载A类静态代码块,再加载A类构造代码块,静态代码块优于构造代码块执行
                new A();4.再实例化A类,静态代码块只加载一次,再加载A类构造代码块
                System.out.println("E");5.输出E
        }
        static{System.out.println("C");}2.加载Test类的这个静态代码块
}


所以最后结果是
B
C
A
D
D
E

楼主你要知道一个类中的静态代码块只会被加载一次


作者: 杨千里    时间: 2012-9-11 00:54
静态代码块随着类的加载而加载只执行一次,所以
static{
                System.out.println("A");
        }
只执行一次。
其他的都正确,所以顺序           是:      B      C       A        D         D           E




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