Swift_关键字static和class的区别


import UIKit
class Person {

    // 给方法添加class关键字
    class func work() {
        print("Type Method: Person: 警察.")
    }

    // 使用static关键字创建类方法
    static func nameOfPerson(name: String) {
        print("Type Method: Person name: \(name)")
    }

    // 可以和类方法重名, 以及一样的参数.
    func nameOfPerson(name: String) {
        print("Instance Method: person name \(name)")
    }
}
class Teacher: Person {
    // 重写父类的类型方法.
    override class func work() {
        print("Type Method: Teacher: University Teacher")
    }
    /**
     * 下面的写法是错误的, 报错信息: Class method overrides a 'final' class method(重写了一个final的类方法.)
     * final 关键字:
     可以通过把方法,属性或下标标记为final来防止它们被重写,只需要在声明关键字前加上final修饰符即可(例如:final var,final func,final class func,以及final subscript)。如果你重写了final方法,属性或下标,在编译时会报错。

     */
//    override static func nameOfPerson(name: String) {
//
//    }

}

class Student: Person {

    // 子类Student的实例方法work(), 和父类的类方法work()没有关系, 二者不在同一个级别上, 不存在同名问题.
    func work() {
        print("Instance Method: Student: University Student")
    }
}
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let per = Person()
        // 父类的类方法
        Person.work()  /**< Type Method: Person: 警察. */
        Person.nameOfPerson("Tom") /**< Type Method: Person name: Tom */
        // 父类的实例方法
        per.nameOfPerson("Edward") /**< Instance Method: person name Edward. */
        // 子类的类方法
        // 直接调用父类的类方法
        Teacher.nameOfPerson("Susan") /**< Type Method: Person name: Susan */
        // 调用的是子类中重写父类的类方法work()
        Teacher.work() /**< Type Method: Teacher: University Teacher */
        let stu = Student()
        // 子类Student的实例方法work()
        stu.work() /**< Instance Method: Student: University Student */
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

关键字static和class的区别

在方法的func关键字之前加上关键字static或者class都可以用于指定类方法.
不同的是用class关键字指定的类方法可以被子类重写, 如下:

    override class func work() {
    print("Teacher: University Teacher")
    }

但是用static关键字指定的类方法是不能被子类重写的, 根据报错信息: Class method overrides a 'final' class method.
我们可以知道被static指定的类方法包含final关键字的特性--防止被重写.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • class关键字除了有自定义类的作用, 还有声明类方法的作用. 资料链接: 1、 方法–类型方法 2、继承–防止重...
    xing_zhu阅读 354评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,082评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,713评论 0 11
  • 天使的诱惑
    沃克尔家族的世界阅读 174评论 0 1