黑马程序员技术交流社区

标题: 关于静态代码块的问题 [打印本页]

作者: 王春蕾    时间: 2014-4-11 20:44
标题: 关于静态代码块的问题
/*
静态代码块:
特点:随着类的加载而执行
作用:给类初始化
*/
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呢?
作者: 呆呆沙师妹    时间: 2014-4-11 20:55
静态代码块随类的加载而加载,但只执行一次。
它初始化的是类的公共属性,在类第一次加载后就存在了,在类的生命周期内,不论以后创建多少个实例对象,公共属性都不会发生改变,再次执行初始化没有意义,故不会再次执行。
作者: 清风夜独醉    时间: 2014-4-11 21:06
首先你要明白静态代码块是随着类的加载而加载,它是用来给类进行初始化用的。
另外静态代码块只加载一次,因为加载一次就已经存在类的静态区里了,就像静态成员和静态方法一样,无论你创建多少个对象,都是只有一个。
作者: 杨殿生    时间: 2014-4-11 21:06
因为静态代码块随着类加载而加载,并且只加载一次
因为StaticCodeDemo类里有主函数,即程序的入口所以要先加载StaticCodeDemo类,静态代码块随之加载,输出BC
然后主函数运行第一句话new StaticCode();加载StaticCode,静态代码随之加载输出A。
第二句new StaticCode();只会创建一个新的StaticCode类的对象,并不会再运行静态代码块,
然后程序运行到System.out.println("D");输出D
所以结果是BCAD
作者: 四川男人    时间: 2014-4-11 22:21
静态代码块是在类加载的时候就加载进内存了,它随着类的生命周期存在而存在,所以一旦加载,内存中就存在了,只加载一次
作者: ﹊佑雨时杰↘    时间: 2014-4-11 22:26
静态代码块随类的加载而加载,但只执行一次。它随着类的生命周期存在而存在,所以一旦加载,内存中就存在了,只加载一次
作者: 黑马-幻灭    时间: 2014-4-11 23:44
首先你应该明白静态代码块是随着类的加载而加载的,而且只执行一次。这时候你应该就可以明白了。与此同时,public  static void main(String args[])是函数的入口,所以第一次输出的是B、C。然后执行函数里面的第一句话,加载StaticCode(),输出A,在执行第二句话,因为静态代码块只能执行一次,所以接下来输出的是D。OK!!
作者: skyfly    时间: 2014-4-12 00:26
首先不可能有2个A,因为static修饰的都只是该类被加载随之加载,而且只执行一次, 且执行顺序:静态代码块>构造代码块>构造函数





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