kotlin中几种特殊函数

  1. 顶层函数和顶层属性
    • java中的方法都属于声明的类中,但是kotlin支持一种特殊的函数即顶层函数,即在文件的顶层(非类中)直接声明函数。
    • 顶层函数的权限是包内权限,在包内可以直接使用,在包外需要import 引入对应的文件,* 代表引入文件内的所有的顶层函数,也可以引入单个顶层函数。
    • 顶层函数的使用和其他函数的调用一致。
    • java访问kotlin顶层函数:需要在声明顶层函数的文件上通过注解标明java中的类名,java中通过类名访问对象的顶层函数即可
    • 顶层函数的原理:kotlin编译成为java文件的时候会为这几个函数生成一个类,这几个函数属于这个类的静态方法,类的权限是默认包内权限,所以可以通过静态方法语法访问。
    • 顶层属性和顶层函数的机制一致。


      顶层函数

      顶层函数:注解标注java类名
  2. 扩展函数和扩展属性
  • java或者kotlin会针对每个类提供一系列的方法或者函数来提供对应的功能,但是不一定能够提供完全的功能,特别是一些三方的sdk想要提供更多的功能方法java不好处理(通常是继承扩展个子类来完善,允许继承),但是kotlin对于此种场景提供了扩展的机制,通过扩展可以方便的让类提供更多的功能,比如String类,内部已提供了length等功能方法,但是要想反转字符串当前系统是不提供对应的方法和函数的,kotlin支持通过扩展String类来添加一个函数实现这个功能,其他的字符串就可以直接使用这个函数。
    • 扩展函数:
      • 语法:fun 需要扩展的类.扩展函数(参数) { 函数体}


        扩展函数
      • 扩展函数的使用:扩展的类对象.扩展函数(实参)


        image.png
      • 扩展函数的使用具体调用那个扩展函数,取决于调用的这个扩展函数所述的扩展类,即扩展函数的直属扩展类,比如父类和子类两个都扩展了同一个名称的扩展函数,外部使用的时候的扩展函数取决于扩展类是父类还是子类,即扩展函数是扩展类的静态函数。


        扩展函数
      • 扩展函数和扩展类的成员函数是同一个函数的时候,扩展函数失效,扩展类的成员函数优先级大于扩展函数,但是可以同一个函数名不同的参数重载扩展函数。


        扩展函数

        扩展函数
      • 扩展函数的函数体中的this指向的扩展类,通过this可以调用扩展类的成员函数和成员属性。
      • java 访问扩展函数的方法:扩展类.扩展函数调用。
    • 扩展属性:
      • 语法:val/var 扩展类.扩展属性名称:扩展属性类型
        get() {}
        set(value) {}


        扩展属性
      • 使用:扩展类.扩展属性名称


        扩展属性
      • 扩展属性没有幕后字段,没有初始化器,必须定义属性访问器。即:扩展属性不能直接初始化即扩展类.扩展属性名称 = 1是不允许的,只能通过声明的set和get访问和设置属性。
      • 只能在文件或者类中扩展属性,不能在函数体中扩展属性。
      • java对于扩展属性的访问和扩展函数一致,也是通过扩展类.扩展属性访问。
    • 伴生对象的扩展:
      • 语法:fun 扩展类.Companion.扩展函数(参数) { }
      • 使用:扩展类.Companion.扩展函数:Companion可以省略。


        伴生对象扩展
  • 定义扩展函数/扩展属性的位置:通常是在包名下的顶层扩展,通常和顶层函数/顶层属性位置相似。


    扩展位置
    • 在包内可以直接通过扩展类.扩展函数直接使用,但是若是在包外不能直接使用,需要通过import的方式将扩展函数导入然后通过扩展类.扩展函数使用。


      包外扩展函数的使用
  • kotlin:在一个类的内部为另一个类提供扩展函数,那么这个类叫做派发者,另一个类被称为接受者


    成员类中的函数扩展
    • 在此种情况下的扩展函数中,倘若派发者和接受者的函数出现冲突,则接受者的函数的优先级要高于派发者的函数,倘若当前想要指明使用派发者的函数则可以通过带限定符的this(就是通过限定符指明当前的this指向那一个对象)指明函数属于派发者的函数,即this@派发者.函数。


      解决派发者和接受者的函数冲突
    • 此种情况的扩展函数可以通过open指定开放,则派发者类的子类可以继承类后重写扩展函数,然而在扩展函数的使用的时候扩展函数的执行依赖于前面的扩展类,前面的扩展类是谁就是谁的扩展函数执行和参数的父子关系无关。


      扩展函数
  • 扩展函数及其其他函数的权限关系:
    • 顶层声明 的扩展函数可以访问顶层属性和顶层函数,成员类中声明的扩展函数可以访问成员类中的函数和属性。
    • 扩展函数不能访问扩展类中的private或者protected函数和属性,可以访问public权限函数或者属性,同包内可以访问默认权限的函数和属性
    • 扩展函数的使用权限是同包内,同包内可以直接调用,不在同包内需要通过import引入扩展函数后才能使用。

参考文章:
kotlin:顶层函数
kotlin: 系统中声明的顶层函数
kotlin: 扩展属性
kotlin:扩展属性和扩展函数

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容