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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文胜平 中级黑马   /  2012-3-7 23:26  /  4036 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 文胜平 于 2012-3-8 00:59 编辑

       
        static{
                System.out.println("a");
        }
       
        {
                System.out.println("c" + this.num);
        }
       

求解这个静态块和构造代码块的区别, 下面这个是不是 构造代码块.
他们的初始化顺序。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

12 个回复

倒序浏览
静态代码块随着类的加载而加载,所以静态代码块执行顺序先于构造代码块。
静态代码块不能使用非静态的成员变量。
静态代码块是用来给类初始化的,而构造代码块是用来给对象初始化的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这两个定义在类中就是你说的静态代码块和构造代码块。
构造代码块是给所有对象进行初始化的。
静态代码块一般是给类进行初始化的。
静态代码块会优先于构造代码块执行,但只执行一次。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
构造代码块
作用:给对象进行初始化  对象一建立就运行,而且优先于构造函数执行。构造代码块中定义的是不同对象共性的初始化内容
静态代码块:
特点:随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的、
静态代码块优先于构造代码块执行。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
静态代码块随着类的加载而加载,也就是说,如果类中有静态代码块,那么系统一加载类,则类中的静态代码块就马上随着类的加载而执行了;然后系统会给在堆内存中开辟空间,对对象进行完默认初始化和显示初始化之后,才执行构造代码块。所以静态代码块要优先于构造代码块执行

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
静态代码块是用于给类初始化的,随着类的加载而执行,只执行一次。而构造代码块是用于给对象初始化的,只要建立对象就会被执行,且优先于构造函数。总体来说,静态代码块优先于构造代码块执行。{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
下面的是构造代码块,但是只是存在类内才有此一说(有点废话了)。
代码块是统一给类或者对象初始化的,优先于普通构造函数运行,当创建对象时候,第一是静态代码块,然后代码块,最后自己对应的构造函数

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!
使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化!
直接在类中定义的没有加static关键字的代码块{}称为构造代码块!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
JVM运行时,静态代码块里面的功能已经加载到内存空间中
随后调用main函数,以后静态代码块就再也不会被调用了
随着创建类的对象,构造代码块会先于构造函数被调用,之后调用相应的构造函数

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
上面的同学都已经说的很全面了。。。我就再明确一下构造代码块和静态代码块们各自的特点吧!

静态代码块:它是属于类的,用于初始化类,只要是静态的东西它属于类,既可以被类调用又可以被该类的对象调用;
构造代码块:属于所有该类的对象,用于初始化该类每一个对象;

分析:构造代码块属于对象,对象属于类,首先要加载类然后才会创建对象,所以先执行静态代码块,然后执行构造代码块。
由于类加载到方法区以后,就可以用来不断地创建对象,创建一次构造代码块就会执行一次来初始化对象,同理,类也会加载一次执行一次初始化,
但是,java虚拟机在执行程序的时候就会优先于主函数加载所用到的类,并且一直存在于方法区至程序结束,所以....

最终结果:静态代码块只执行一次,并且优先于主函数。引见毕老师面向对象一节!欢迎采纳!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
静态代码块是在类加载之后立即执行,而构造代码块是给对象进行统一的初始化,当然静态代码块在构造代码块之前执行;
静态代码块 1: 在类加载之后立即执行;
                 2: 不能使用外部非静态成员;
                3: 静态代码块和静态成员变量指定值的顺序是由代码从上到下的顺序决定的;
                4: 如果有一段代码 我们希望在加载某个类的时候执行,而且只执行一次的时候,就可以使用静态代码块;
构造代码块是给对象进行统一初始化的;
构造代码块中定义的是不同对象共性的初始化内容;

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
袁野 黑马帝 2012-3-9 11:49:02
12#
上面都说了很多

我在说一句 静态代码块是为类初始化的

构造代码块是为所有对象初始化的。。
回复 使用道具 举报
学习学习。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马