/*
继承与构造方法:
指定构造与便利构造器方法
*/
class Person {
var name:String
var age:Int
//指定构造方法都是以init开头
init(name:String, age:Int)
{
self.name = name
self.age = age
}
//1.如果是值类型没问题, 称之为构造器代理;
//2.但是如果是引用类型报错, 需要在前面加上 convenience关键字;
//3.被convenience关键字修饰的构造方法称之为便利构造器, 通过调用其他构造方法来初始化;
//4.反而言之, 便利构造器中一定是调用其他构造方法初始化的, 一定要出现self.init
convenience init()
{
self.init(name: "hjq", age: 26)
}
//类可以拥有多个构造方法
init(name:String)
{
self.name = name
self.age = 0
//不能再指定构造方法中调用便利构造器方法
//换言之,指定构造方法中不能出现self.init
// self.init()
}
convenience init(age:Int)
{
//可以在便利构造器中调用指定构造器
// self.init(name: "hjq", age: 24)
self.init()
}
// 便利构造器不能和指定构造器同名
// convenience init(name:String)
// {
// }
}
/** 派生类的构造方法 **/
class Man {
var name:String
//指定构造方法
init(name:String)
{
self.name = name
}
convenience init(){
self.init(name: "hjq")
}
}
class SuperMan: Man {
var age:Int
// 注意:
// 1.默认情况下构造方法不会被继承
// 2.基类的存储属性只能通过基类的构造方法初始化
// 3.初始化存储属性时必须先初始化当前类再初始化父类
// 4.不能通过便利构造方法初始化父类, 只能通过调用指定构造方法初始化父类
//指定构造器
init(age:Int) {
self.age = age
super.init(name: "han")
// super.init()
}
}
/*
构造器间的调用规则:
1.指定构造器必须调用其直接父类的"指定构造器"
2.便利构造器必须调用同类中的其他便利构造器(指定或者便利)
3.便利构造器必须最终调用一个指定构造器结束(无论指定还是便利, 最终肯定调用一个指定构造器)
4.指定构造器总是横向代理(父类)
5.便利构造器总是横向代理(子类)
*/
class Man2 {
var name:String
//指定构造器
init(name:String) {
self.name = name
}
convenience init(){
self.init(name: "HaRi")
}
}
class SuperMan2: Man2 {
var age:Int
//指定构造器
init(age:Int) {
self.age = age
super.init(name: "xiaohange")
}
convenience init()
{
self.init(age: 25)
}
convenience init(name: String, age: Int) {
//调用子类构造器一定能够初始化所有属性
// self.init(age: 30)
//便利构造器中只能通过self.init来初始化, 不能使用 super.init
&