A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tesla时光 中级黑马   /  2012-9-10 22:51  /  1475 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁发达 于 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");}
}

评分

参与人数 1黑马币 +10 收起 理由
刘芮铭 + 10 细节基础问题多注意

查看全部评分

6 个回复

倒序浏览
这段代码执行的时候,首先主函数的  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
(静态代码块是给类初始化的,当类被加载到内存时,就会执行,而且只执行一次)

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
结果是:
B
C
A
D
D
E

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

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

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

未命名.JPG

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
static代码块只能加载一次, 你new 了两个A()也只会执行一次System.out.println("A");
所以顺序就为  B C A D D E
回复 使用道具 举报
本帖最后由 王得新 于 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类中的构造函数

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
静态代码块随着类的加载而加载只执行一次,所以
static{
                System.out.println("A");
        }
只执行一次。
其他的都正确,所以顺序           是:      B      C       A        D         D           E
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马