2020-11-10类

2020-11-10  本文已影响0人  脑子
类和结构体很相似,它们都允许你创建自己的属性和方法。
一个类可以继承自另一个类,它会获得父类的所有属性和方法。谈到类层次结构的时候,我们经常说一个类基于另一个类,也就是一个类继承自另一个类。
你可以用 final 关键字来标记一个类,这样可以阻止它被继承。
方法重写使得一个子类可以用全新的实现来替代父类中的实现。
当两个变量指向同一个实例时,它们指代的对象在内存中占用同一块区域,改变其中一个也会改变另一个。
类可以有析构器,它们是类的实例被销毁时执行的代码。
类不像结构体那样受常量的强制约束。如果类的一个属性被声明为变量,那么无论类的实例是否以变量的方式创建,这个属性都可以被修改。
//类 类必须自己写init
class Dog {
    var name: String
    var breed: String
    
    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
    
    func makeNoise(){
        print("汪汪汪!")
    }
}
//let poppy = Dog(name: "Poppy", breed: "贵宾犬")

//类的继承,会继承Dog的属性和构造器,子类里调用 super.init()
//class Poodle: Dog {
//    init(name: String){
//        super.init(name: name, breed: "贵宾犬")
//    }
//}
//let gou = Poodle(name: "小白")
//print(gou.name)
//

//class Poodle: Dog{}
let poppy = Poodle(name: "小白", breed: "贵宾犬")
poppy.makeNoise()

//重写方法
class Poodle:Dog{
    override func makeNoise() {
        print("yeyeye!")
    }
}
//无法继承的泪, final class
final class Dog{
    var name: String
    var breed: String
    
    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}

//当你复制一个结构体时,原始对象和复制体是不一样的两个东西,改变其中一个并不会改变另外一个。当你复制一个 类 时,原始对象和复制体都指向相同的东西,所以改变其中一个也会改变另一个。
class Singer {
    var name = "张学友"
}
var singer = Singer()
print(singer.name)
var singerCopy = singer
singerCopy.name = "周杰伦"
print(singer.name)
//结果是周杰伦,如果Singer是结构体,那第二次还是张学友
//构造器init为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务
//在一个类的实例被释放之前,析构函数被立即调用。用关键字deinit来标示析构函数,类似于初始化函数用init来标示。析构函数只适用于类类型。

//类的析构器,析构器是实例被销毁时执行的代码
class Person{
    var name = "joe biden"
    
    init(){
        print("\(name)是新的美国总统")
    }
    
    func printGreeting(){
        print("hello,i am \(name)")
    }
    
    deinit {
        print ("\(name) 现在不用了!")
    }
}

for _ in 1...3 {
    let person = Person()
    person.printGreeting()
}
//joe biden是新的美国总统,hello,i am joe biden 被执行3次

var counter = 0 // 引用计数器
class BaseClass {
    init() {
        counter += 1
    }
    
    deinit {
        counter -= 1
    }
}

var show: BaseClass? = BaseClass()
print(counter)

//当 show = nil 语句执行后,计算器减去 1,show 占用的内存就会释放。
show = nil
print(counter)
//结果为1 0

//类的可变性
//常量结构体,它有一个变量属性,那么这个变量属性是无法修改的;
//如果它是一个常量类,也有一个变量属性,那么这个变量属性是可以被修改的。
//基于这个区别,类的方法在改变属性时,并不需要 mutating 关键字,而结构体则需要
//这个区别意味着你可以修改类中的任何变量属性,即便类的实例本身被声明为常量。
class Singer {
    var name = "张学友"
}
let geshou = Singer()
geshou.name = "周杰伦"
print(geshou.name)
//如果不想属性被修改,则必须直接把属性声明为常量let name = "张学友"
上一篇下一篇

猜你喜欢

热点阅读