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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李斌 于 2012-5-23 10:00 编辑

一位哥们的帖 http://bbs.itheima.com/thread-15230-1-1.html
我在那边问 怕没有人回答,所以搬到这里来问了,不求给分 但求释疑~
问题:
我运行了一下它的代码 发现
明明newl了两个不同的对象 为什么 只打印了一个a啊??
new StaticCode();
new StaticCode();

class StaticCode
{
        int num = 9;
        StaticCode()
        {
                System.out.println("StaticCode 空参数的构造函数b");
        }

        static
        {
                System.out.println("StaticCode静态代码块a");
        }
        {
                System.out.println("StaticCode构造代码块"+this.num);
        }

        StaticCode(int x)
        {
                System.out.println("StaticCode带参数的构造函数d");
        }
        public static void show()
        {
                System.out.println("show run");
        }
}

class StaticCodeDemo
{
        static
        {
                System.out.println("主函数静态代码块b");
        }
        public static void main(String[] args)
        {
                new StaticCode(4);
                new StaticCode();
               

        }
        static
        {
                System.out.println("主函数静态代码块c");
        }
}

不多说 上图:



B9SJ6)U9B1X29ED]C5D_G84.jpg (16.28 KB, 下载次数: 106)

B9SJ6)U9B1X29ED]C5D_G84.jpg

9 个回复

倒序浏览
静态代码块作用于类加载时,与你建几个对象无关。
回复 使用道具 举报

回帖奖励 +1

你想知道答案,需要知道对象实例化的过程,首先:你new什么对象JVM就要找到你类的StaticCode.class文件加载到内存,然后执行static代码块,如果有的话,给所属的StaticCode.class类进行初始化,然后在堆内存中开辟空间,分配内存地址。看到这里你应该知道你的对象建立多少和你那个静态代码块执行次数没有关系,它是给你这个.class进行初始化的执行的,不管你有几个对象,你在内存中只有一份.class文件所以它只作用在类加载时执行,而且只执行一次,不会重复执行的...希望对你有帮助
回复 使用道具 举报

回帖奖励 +1

父类静态代码块-->子类静态代码块-->父类构造代码块-->父类构造函数-->子类构造代码块-->子类构造函数(对应参数列表的)
以上是一个子类对象建立的初始化顺序。
关于静态代码块,楼上的说的很全了,其实可以简单的理解为静态代码块用于给类初始化,构造代码块和构造函数是用于给对象初始化的。
回复 使用道具 举报
丰亚彬 发表于 2012-5-23 10:06
你想知道答案,需要知道对象实例化的过程,首先:你new什么对象JVM就要找到你类的StaticCode.class文件加载 ...

3q~~~~~~~~
回复 使用道具 举报

回帖奖励 +1

静态代码块随着类的加载而加载,与你所建立的对象的个数是无关的。运行的时候这个class类文件加载进内存中,给所属的StaticCode类进行初始化,而构造代码块随着对象的建立而加载,给对象进行初始化。
回复 使用道具 举报
徐炯 中级黑马 2012-5-24 14:56:05
7#

回帖奖励 +1

class StaticCode
{
        int num = 9;
        StaticCode()
        {
                System.out.println("StaticCode 空参数的构造函数b");
        }

        static
        {
                System.out.println("StaticCode静态代码块a");
        }
        {
                System.out.println("StaticCode构造代码块"+this.num);
        }

        StaticCode(int x)
        {
                System.out.println("StaticCode带参数的构造函数d");
        }
        public static void show()
        {
                System.out.println("show run");
        }
}

class StaticCodeDemo
{
        static
        {
                System.out.println("主函数静态代码块b");
        }
        public static void main(String[] args)
        {
                new StaticCode(4);
                new StaticCode();
               

        }
        static
        {
                System.out.println("主函数静态代码块c");
        }
}

对象实例化的过程:
1,类加载。你new什么对象JVM就要找到你类的StaticCode.class文件加载到内存,
2,对类进行初始化。即:执行static代码块或者普通代码块给StaticCode.class类进行初始化。
3,在堆内存为new对象中开辟空间,分配内存地址。
第一步和第二步在内存中的方法区上加载的。static代码块的生命周期和类相同,类存在,static代码块就加载在方法区里,类消失static代码块分配到的空间就会被回收。第三步,是在堆内存中为new对象分配内存地址。他们不在同一块内存上。
所以不管你new几个对象,因为在内存中只有一份.class文件而且它只在类加载时执行,而且只执行一次,不会重复执行。
回复 使用道具 举报
李海 中级黑马 2012-5-24 21:07:05
8#
  静态代码块只初始化一次
回复 使用道具 举报
简单的说,static修饰的静态代码块在初始化时只被执行一次
回复 使用道具 举报
首先,构造代码块、构造函数、静态代码块,这三者的执行顺序:先执行静态代码块,接着执行构造代码块,最后执行构造函数,
1,静态代码块用于对类进行初始化,也就是类一加载的时候就已经执行;
2,构造代码块用于对所有对象进行初始化,优先于构造函数执行。
3,构造函数使用于对具体对象进行初始化,对象建立,它也跟着加载进去。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马