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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘志雄 中级黑马   /  2013-1-15 12:18  /  2395 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 11:11 编辑

求构造代码块与加了static的构造代码块得区别?它们之间在内存中的分配有什么不同?
加了static的构造代码块与静态成员变量内存分配方式是否相同?
加了static的构造代码块按理来说是不是也是随着类的加载而加载?
三种情况的结构:
静态成员变量
static int num = 9;

构造代码块
{
}

加了static的构造代码块
static
{
}

主要的目的就是他们三者有什么区别及联系?
谢谢高人指教

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 鼓励提问

查看全部评分

4 个回复

倒序浏览
本帖最后由 黄金龙 于 2013-1-15 13:06 编辑

相同的 都在构造函数前执行,可以定义多个,一般都在代码块为某些static变量进行赋值
不同的 执行顺序 先静态代码块 后非静态代码块 再构造函数 ,而静态代码块只执行一次,非静态代码块每次new都会执行

评分

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

查看全部评分

回复 使用道具 举报
    这么说吧,安装他们的执行优先级来排序:
静态成员变量>静态构造代码块>构造代码块

    我们定义一个类时,这三者都可能存在,静态成员变量就是在方法区中存放,优先于对象存在。并共享该成员变量。节省每次调用该类的时候都要重新加载该成员变量。
而静态构造代码块,是用于给类进行初始化。它随着类的加载而加载。只执行一次,优先于主函数。
   
    普通的构造代码块,它也是给对象进行初始化。对象一建立就运行并且优先于构造函数。并且构造代码块是给所有对象进行统一初始化,

    这两者的关系就是都是进行初始化的。但是静态代码块只有在第一次调用该对象的时候才执行(或者说实在创建对象的时候执行),之后再调用就不再执行了,而普通的构造代码块是随着每一次的调用而加载!

评分

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

查看全部评分

回复 使用道具 举报
我先说他们运行的顺序吧 在new 对象的时候他会先找到你那个类类对应的class文件加载在内存中
然后执行静态的代码块 然后在堆内存中开辟空间
分配内存的地址 然后在对象中建立他们的默认特有属性 加载默认属性的默认值 然后再执行构造代码块里面的语句
静态代码块在类一加载后就开始执行静态代码块 存储在方法区内存里面 而在对象一初始化就开始执行构造代码块 执行完后
再初始化相匹配的构造方法
static的构造代码块与静态成员变量都在类一加载就存储在内存的方法区 他们属于类名所调用 所以他们的内存地址是相同的都是在内存方法区
加static的静态代码块他们就是随着类一加载就已经加载了

他们内存的区别 静态属性和静态代码块都存储在内存方法区 在类一加载就执行
而构造代码块在创建初始化对象后才开始执行

评分

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

查看全部评分

回复 使用道具 举报
static变量只与他所在的类有关,并在编译时分配内存,而与类的对象无关。比如类A里有个static s, 那么任何一个类A的对象都可以修改他,并且是共享式修改。 可以认为这个静态就是共享的意思。而其他成员,包括构造方法,都是属于对象的,静态代码块是在类一被加载的时候就执行

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马