0%

static与初始化顺序

摘要:
1.static的含义
2.初始化顺序
3.静态初始化从句(静态块)
4.非静态实例的初始化

static的含义

P104
static意味着一个特定的方法没有this;
##static特点
1.不能在一个static方法内部(直接)调用非静态方法(注释①),反过来可以;
2.在没有对象的前提下,可以针对类本身发出对一个static方法的调用;
3.若将一个static方法置入一个类的内部,它就可以访问其他static方法以及static字段;
注释①:可以将一个对象的句柄传到static方法内部,随后,通过句柄(此时实际是this),可以调用非static方法,并访问非static字段。(但一般的,如果真想这么做,只要制作一个普通的、非static的方法即可);


初始化顺序

P114
以一个名为Dog的类为例:
(1)类型为Dog的一个对象首次创建是,或者Dog类的static方法或字段首次访问时,java解释器必须找到Dog.class(在事先设好的类路径里搜索)
(2)找到Dog.class后(会创建一个class对象),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——在class对象首次载入的时候
(3)创建一个new Dog() 时,Dog对象的构建过程首先会在内存堆(heap)里为一个Dog对象分配足够多的存储空间。
(4)这些存储空间会清零,将Dog中所有的基础类型设为默认值(数字为0,Boolean为false,char为空(null))。
(5)进行字段定义是发生的所有初始话都会执行。
(6)执行构造器。(实际可能要求进行相当多的操作,特别是在设计继承的时候)。


静态初始化从句(静态块)

P114

1
2
3
4
5
6
class Test{
static int i;
static{
i = 47;
}
}

非静态实例的初始化

1
2
3
4
{
a = new Test();
b = new Test();
}

为支持“匿名内部类”的初始化(第七章),必须采用这一语法格式。