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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王春蕾 中级黑马   /  2014-4-11 20:44  /  1014 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
静态代码块:
特点:随着类的加载而执行
作用:给类初始化
*/
class StaticCode
{
        static
        {
                System.out.println("A");
        }
}

class StaticCodeDemo
{
        static
        {
                System.out.println("B");
        }
        public static void main(String[] args)
        {
                new StaticCode();
                new StaticCode();
                System.out.println("D");
        }
        static
        {
                System.out.println("C");
        }
}
这段代码的执行结果为什么会是BCAD而不是BCAAD呢?

7 个回复

倒序浏览
静态代码块随类的加载而加载,但只执行一次。
它初始化的是类的公共属性,在类第一次加载后就存在了,在类的生命周期内,不论以后创建多少个实例对象,公共属性都不会发生改变,再次执行初始化没有意义,故不会再次执行。
回复 使用道具 举报 1 0
首先你要明白静态代码块是随着类的加载而加载,它是用来给类进行初始化用的。
另外静态代码块只加载一次,因为加载一次就已经存在类的静态区里了,就像静态成员和静态方法一样,无论你创建多少个对象,都是只有一个。
回复 使用道具 举报
因为静态代码块随着类加载而加载,并且只加载一次
因为StaticCodeDemo类里有主函数,即程序的入口所以要先加载StaticCodeDemo类,静态代码块随之加载,输出BC
然后主函数运行第一句话new StaticCode();加载StaticCode,静态代码随之加载输出A。
第二句new StaticCode();只会创建一个新的StaticCode类的对象,并不会再运行静态代码块,
然后程序运行到System.out.println("D");输出D
所以结果是BCAD
回复 使用道具 举报
静态代码块是在类加载的时候就加载进内存了,它随着类的生命周期存在而存在,所以一旦加载,内存中就存在了,只加载一次
回复 使用道具 举报
静态代码块随类的加载而加载,但只执行一次。它随着类的生命周期存在而存在,所以一旦加载,内存中就存在了,只加载一次
回复 使用道具 举报
首先你应该明白静态代码块是随着类的加载而加载的,而且只执行一次。这时候你应该就可以明白了。与此同时,public  static void main(String args[])是函数的入口,所以第一次输出的是B、C。然后执行函数里面的第一句话,加载StaticCode(),输出A,在执行第二句话,因为静态代码块只能执行一次,所以接下来输出的是D。OK!!
回复 使用道具 举报
skyfly 中级黑马 2014-4-12 00:26:27
8#
首先不可能有2个A,因为static修饰的都只是该类被加载随之加载,而且只执行一次, 且执行顺序:静态代码块>构造代码块>构造函数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马