//构造方法的目的就是确保类的所有非lazy存储属性进行初始化
@H_404_10@ //可选类型的存储属性可以不用初始化(默认为nil)
class Point {
var x: Int = 0
var y: Int = 0
var z: Int?
init () {
@H_404_10@ //缺省构造方法(存储属性有初始值)print("缺省init")
}
init (x: Int,y: Int) {
//带参的构造方法
self.x = x
self.y = y
print("带参init")
}
//便利构造方法
convenience init (x: Int) {
// self.x = x
// y = 100
//若想在构造方法中使用self.init,前面必须添加convenience(便利)
//若构造方法前添加convenience,则方法中必须使用self.init
self.init(x: x,y: 100)
}
convenience init (z: Int) {
self.init(x: 50)
//两段式构造方法,self的使用不能放在self.init之前
//防止出现使用未初始化变量的情况
print("遍历构造方法\(x)")
}
func testFunc() {
print("用于重写")
}
final func testFunc2() {
print("不能被重写")
}
}
var p1 = Point()
var p2 = Point(x: 100,y: 100)
var p3 = Point(x: 20)
var p4 = Point(z: 100)
/*继承
@H_404_10@ 1、swift的继承仍然是单继承 @H_404_10@ 2、构造方法无法继承,普通方法和属性都可继承 @H_404_10@ 3、调用父类方法使用super关键字 @H_404_10@ 4、重写父类方法使用override关键字 @H_404_10@ 5、不想被重写的父类方法前加final关键字*/
class SubPoint: Point {
var w: Int
init(w: Int) {
self.w = w
super.init()
//不能是遍历构造方法
//super.init(x: 100)
}
override func testFunc() {
print("父类重写")
}
//子类中不能重写
//override func testFunc2() {}
}
/*
一个更方便记忆的方法是:
@H_404_10@ 1、指定构造器必须总是向上代理 @H_404_10@ 2、便利构造器必须总是横向代理
*/