// 子类的指定构造方法必须调用父类构造方法,并确保调用发生在子类存储属性初始化之后。而且指定构造方法不能调用同一个类中的其他指定构造方法; // 便利构造方法必须调用同一个类中的其他指定构造方法(可以是指定构造方法或者便利构造方法),不能直接调用父类构造方法(用以保证最终以指定构造方法结束); // 如果父类仅有一个无参构造方法(不管是否包含便利构造方法),子类的构造方法默认就会自动调用父类的无参构造方法(这种情况下可以不用手动调用); // 常量属性必须默认指定初始值或者在当前类的构造方法中初始化,不能在子类构造方法中初始化; // class Person{ var firstName : String,lastName:String var age:Int=0 var fullName:String{ get{ return firstName+""+lastName } } init(firstName:String,lastName:String){ self.firstName = firstName self.lastName = lastName } func showMessage() { print("name=(fullName),age=(age)") } //通过final声明 子类无法重写 final func sayHello(){ print("hello world.") } } class Student:Person{ //重写属性监视器 override var firstName: String{ willSet{ print("oldValue=(firstName)") } didSet{ print("newValue=(firstName)") } } var score:Double //子类指定构造方法一定要调用父类构造方法 //并且必须在子类存储属性初始化之后调用父类构造方法 init(firstName:String,lastName:String,score:Double){ self.score = score super.init(firstName:firstName,lastName:lastName) } convenience init(){ self.init(firstName:"",lastName: "",score: 0) } //重写方法 override func showMessage() { print("name=(fullName),age=(age),score=(score)") } } let aa = Person(firstName: "test",lastName:"TEST") aa.showMessage() aa.sayHello() let p = Student(firstName: "1111",lastName: "1111",score: 1111) p.firstName = "test"