普通初始化器函数init()用于初始化新对象。与之对应,静态初始化器函数则用于初始化类型的静态数据成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package Rectangle

class Rectangle {
static let edgeCount:Int64
static var internalAnglesSum:Int64
static func computeInternalAnglesSum():Int64 {
return (edgeCount-2)*180 //内角和 = (边数-2) * 180
}

static init() {
edgeCount = 4
internalAnglesSum = computeInternalAnglesSum()
println("静态初始化器函数被执行:${edgeCount}, ${internalAnglesSum}")
}

init(width:Int64, height:Int64){
//...
println("普通初始化器(构造函数)被执行:${width}, ${height}")
}
}

main(): Int64 {
println("--------------------------------------------")
let r = Rectangle(300,200)
return 0
}

上述程序的执行结果为:

1
2
3
4
静态初始化器函数被执行:4, 360
--------------------------------------------
普通初始化器(构造函数)被执行:300, 200
[空行]

▶第3行:Rectangle为自定义的矩形类。

▶第4 ~ 5行:定义静态成员变量edgeCount(边数)和internalAnglesSum(内角和)。按稍早的讨论,静态成员变量仅存在于Rectangle类型对象中,不属于任何Rectangle类型的实例对象。

▶第6 ~ 8行:静态成员函数依据边数计算并返回多边形的内角和。此处引入该函数, 是出于教学目的化简就繁。按稍早的讨论,静态成员函数没有隐含的this参数,其内不能访问类型的非静态成员。

▶第10 ~ 14行:static init()即为该类型的静态初始化器函数。静态初始化器用于初始化类型的全部静态成员变量,由于该函数预期不能被显式调用,故静态初始化器不允许有参数,也不包含隐含的this参数。在该函数中,必须完成类型全部的静态成员变量的初始化,否则将编译报错。

▶第12行:调用执行类型的静态成员函数computeInternalAnglesSum计算内角和,并赋值初始化静态成员变量internalAnglesSum。

▶第16 ~ 19行:普通构造函数。该函数预期在创建新对象时被调用。

  从执行结果第1行可见,静态初始化器函数的执行输出早于”————“分界线,其调用是由编译器自动完成的。与程序第24行相对应,r对象的构造函数的输出见执行结果第3行。与静态初始化器函数的自动调用不同,普通构造函数的执行是对象创建的结果。