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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔青山 中级黑马   /  2014-2-13 15:55  /  1584 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 乔青山 于 2014-2-13 16:51 编辑

如题,初始化知道。初始化块是什么?
新手求解答啊,急急急!

评分

参与人数 1黑马币 +2 收起 理由
zzkang0206 + 2 淡定

查看全部评分

10 个回复

倒序浏览
初始化块跟构造函数对比:
1.初始化块是构造函数的补充,它在构造函数之前执行,作用也是对对象进行初始化。
2.初始化块跟构造函数不同的是,它不接受任何参数,它只是一段固定的代码,它对类的所有对象都执行相同的初始化。
回复 使用道具 举报
static void haha
{
//具体的内容
}
调用一个类时,该静态块首先调用,并且只调用一次,再调用构造器

1、在类第一次加载时候,会执行静态域(field)初始化语句和静态块(用static{}包含的部分)。
这里要注意:
    a、不管静态域声明语句的实际位置在哪儿,当第一次加载类的时候都会首先对它初始化为缺省值(0,false,null等)。
    b、即使静态域声明中使用了显式初始化语句(比如:int x=3),第一次加载类的时候也会先把它初始化为缺省值(此时x为0),然后再按照下面说的要点c来执行赋值语句(x=3)。
    c、对于静态域的显式初始化语句和静态块,按照在类中代码出现的先后顺序执行。
      因此,在上面的例子程序中,我们看到
2、当构造类实例时候,会先对实例域初始化为缺省值,然后执行实例块(用{}括起来的部分),然后执行构造方法。其中:
    a、如同1中一样,如果有实例域的显式初始化语句,程序仍然是先将该域初始化为缺省值,然后按照代码在类中出现的先后顺序执行初始化语句或者实例块。如果实例块位置在初始化语句前面,即使它改变了该域的值,也会被随后执行的初始化语句改回去。
    b、在进入构造方法后,如果构造方法第一句是使用this(...)调用另一构造方法的话,则先执行另一构造方法,然后再执行本构造方法的方法体。这种用法必须让this(...)位于第一句。
回复 使用道具 举报
本帖最后由 唐宋元明清 于 2014-2-13 16:23 编辑

初始化块应该是构造代码块:
它就是用{ ... }括起来的一段语句,作用是给所有对象初始化,所以里面的初始化是所有对象的共性内容,在构造函数之前运行。
静态初始化块就是静态代码块:
必须用static{...}表示,它是给类初始化用的,比如你想用的常数PI=3.14就可以定义在里面,它里面的内容在类加载时就会加载,存活时间是最长的,作用在整个类中,但是十分的不常用。
回复 使用道具 举报
静态代码块、构造代码块和构造函数的区别:
一、用途的不同:
静态代码块:给类初始化
构造代码块:给对象初始化
构造函数:给对应对象初始化
二、执行情况的不同:
静态代码块:实例化时 执行,类名引用时 执行
构造代码块:实例化时 执行,类名引用时 不执行
构造函数:实例化时 执行,类名引用时 不执行
执行顺序:
(1) 实例化:静态代码块->构造代码块->构造函数
(2) 类名引用:静态代码块
三、内部功能实现的不同:
静态代码块:可以调用类中的静态变量或函数(方法),不可以调用类中的非静态变量或函数(方法)
构造代码块:可以调用类中的静态变量或函数(方法),可以调用类中的非静态变量或函数(方法)
构造函数:可以调用类中的静态变量或函数(方法),可以调用类中的非静态变量或函数(方法)
回复 使用道具 举报
李金中 发表于 2014-2-13 16:13
初始化块跟构造函数对比:
1.初始化块是构造函数的补充,它在构造函数之前执行,作用也是对对象进行初始化 ...

哦。。谢谢
回复 使用道具 举报
本帖最后由 乔青山 于 2014-2-13 17:01 编辑
眷恋之地 发表于 2014-2-13 16:49
静态代码块、构造代码块和构造函数的区别:
一、用途的不同:
静态代码块:给类初始化

类名引用什么意思。。。通过对象调用类属性?另外,我写了个小程序测试了下,实例化多个对象的时候。只有第一次实例化调用静态代码块,之后的不调用
回复 使用道具 举报
乔青山 发表于 2014-2-13 16:58
类名引用什么意思。。。通过对象调用类属性?

通过类名调用类中的静态成员,如:Person.country之类的
回复 使用道具 举报
眷恋之地 发表于 2014-2-13 17:00
通过类名调用类中的静态成员,如:Person.country之类的

哦。。明白了
嗯。。测试了下都没问题,有一点:
实例化多个对象的时候(包括类名引用)。只有第一次实例化(或类名引用)调用静态代码块,之后的不调用,对么?
回复 使用道具 举报
乔青山 发表于 2014-2-13 17:04
哦。。明白了
嗯。。测试了下都没问题,有一点:
实例化多个对象的时候(包括类名引用)。只有第一次实例 ...

当类被加载进内存时,会调用一次静态代码块,之后无论是实例化还是类名引用都不会再运行静态代码块,不过静态代码块造成的改变是存在的。
回复 使用道具 举报
眷恋之地 发表于 2014-2-13 17:11
当类被加载进内存时,会调用一次静态代码块,之后无论是实例化还是类名引用都不会再运行静态代码块,不过 ...

哦哦,明白了,谢谢谢谢~总结的很系统。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马