前言

最近试用了下kotlin,因为也是一个在jvm执行的静态语言,所以快速熟悉了下语法就直接用了。但是用的过程中,还是有些地方花费了很长时间才理解。仅此记录下来

object关键字

object是kotlin中一个很重要的关键字,java中没有。object关键字直译过来就是“对象”,object关键字用法有很多种,如对象声明、伴生对象、对象表达式等。我们先来从最简单的看:

  • 对象声明

我们先来写一个object修饰的类,然后转成java代码看一下:

object Test {fun hello() {}
}
复制代码

这是一个object修饰的类,使用object关键字后就不能再使用class关键字了。我们用as的工具将其转换为java代码如下:

public final class Test {public static final Test INSTANCE;public final void hello() {}static {Test var0 = new Test();INSTANCE = var0;}
}
复制代码

生成的java代码可以看出,这是一个final修饰的类,并且在加载类的时候实例化出一个对象INSTANCE,你大概隐隐猜出了这个object关键字代表着什么含义吧!
对的,如果你用object声明一个类,这个类就是一个“单例的类”。如果你在AndroidStudio中打算继承此类,会飘红报错“Cannot inherit from a singleton”,即不能继承一个单例,从java代码中也可以看出。
做下总结:object关键字声明一个类,这个类就是单例的,不能再创建实例,并且没有构造器,调用的时候有以下两种方法:

//直接类名调用
Test.hello()//赋给一个常量,再调用
val a : Test = Test
a.hello()
复制代码
  • 伴生对象(Companion object)

在用kotlin的时候,我发现kotlin中没有static关键字,那么如何来表示出static的效果呢?我还以一个例子来解释:

class Test1 {companion object CO {val filed : String = "I'm in companion object"fun coHello(){println(filed)}}fun hello() {println("I'm Test1")}
}
复制代码

转成java代码后:

public final class Test1 {@NotNullprivate static final String filed = "I'm in companion object";public static final Test1.CO CO = new Test1.CO((DefaultConstructorMarker)null);public final void hello() {String var1 = "I'm Test1";System.out.println(var1);}@Metadata(mv = {1, 1, 11},bv = {1, 0, 2},k = 1,d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0003\n\u0002\u0010\u0002\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u0006\u0010\u0007\u001a\u00020\bR\u0014\u0010\u0003\u001a\u00020\u0004X\u0086D¢\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006¨\u0006\t"},d2 = {"Lorg/doubleprotein/mathilda/notes/Test1$CO;", "", "()V", "filed", "", "getFiled", "()Ljava/lang/String;", "coHello", "", "app"})public static final class CO {@NotNullpublic final String getFiled() {return Test1.filed;}public final void coHello() {String var1 = ((Test1.CO)this).getFiled();System.out.println(var1);}private CO() {}// $FF: synthetic methodpublic CO(DefaultConstructorMarker $constructor_marker) {this();}}
}
复制代码

可以看得出,伴生对象类似于java中的静态内部类,并且在Test1中会持有一个伴生对象的实例,我们在调用伴生对象的方法时,有以下两种调用方式:

//方式1
Test1.CO.coHello()//方式2
Test1.coHello()//调用属性
Test1.filed
复制代码

效果是不是跟java中调用static方法或属性很相似。当然kotlin中替代static关键字特性的东西不止半生对象一个,还有一个包级别函数也可以用来替代。

apply

apply函数的返回值是本身,在函数内部,你可以任意调用对象的属性或方法或给属性赋值等!我们还是通过例子来看:

class People {var eye : Int = 2var leg : Int = 2fun hello() {println("eyes=" + eye + ", legs=" + leg)}
}
复制代码

定义Peoplele类,然后创建实例,并调用它的apply方法:

fun test() {val p = People()p.apply {eye = 3hello()leg = 5}.hello()p.hello()
}
复制代码

我们看转换成的java代码:

public final void test() {People p = new People();p.setEye(3);p.hello();p.setLeg(5);p.hello();p.hello();
}
复制代码

由java代码也可以看出,apply函数极大的简化了给对象赋值等操作,并且会将自身返回。kotlin的这些语法糖还是很有意思的!

kotlin特性之object、apply用法总结相关推荐

  1. Kotlin特色之object、let、with、run、apply、also函数的使用

    前言 相比Java,Kotlin提供了不少高级语法特性.对于一个Kotlin的初学者来说经常会写出一些不够优雅的代码.在Kotlin中的源码标准库(Standard.kt)中提供了一些Kotlin扩展 ...

  2. Kotlin 特性 语法糖 优势 扩展 高阶 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. boost::hana::apply用法的测试程序

    boost::hana::apply用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::apply用法的测试程序 C++实现代码 #include <boost/han ...

  4. js中call与apply用法

    来源:http://blog.csdn.net/sunboy_2050/article/details/6592082 前天去面试,有个gg问了一些js知识,其中有一道call与apply用法的题目, ...

  5. LinQ To Object 基本用法

    LinQ To Object 基本用法 inq的基本语法:var result = from item in container select item; linq获取数据子集: var result ...

  6. oracle oats 工具讲解,Oracle 21c 新特性:Object Activity Tracking System 对象活动跟踪系统...

    Oracle 21c 新特性:Object Activity Tracking System 对象活动跟踪系统 在 Oracle Database 21c 中,OATS 新特性引入进来,OATS 是 ...

  7. Kotlin中also与apply的区别

    Kotlin中also与apply的区别 also和apply的差别主要存在于lambda表达式内context表示方式 also是通过传入的参数(it)来表示 apply是通过this来表示 als ...

  8. Object.assign()用法讲解

    Object.assign()用法讲解 语法: Object.assign(target, -sources) target: 目标对象,sources: 源对象 用于将所有可枚举属性的值从一个或多个 ...

  9. ES6之Object.assign()用法,Object.assign()到底是浅拷贝还是深拷贝?

    基本用法 Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). const target = { a: 1 }; const sou ...

最新文章

  1. Cannot resolve method 'getParameter( )'
  2. 数据集轻松按需搜索,这个工具汇集近2000个图像数据集,可免费获取|Reddit高热...
  3. 图解虚拟机中CentOS安装使用和编程
  4. Python并发编程—进程
  5. java BigDecimal去掉小数点后的零
  6. java 逐行写入csv_go|使用go读写CSV文件
  7. strstrsubstr、AfxGetApp
  8. 环境变量_Jenkins流水线环境变量权威指南
  9. python字符串连接数字电视_【学习猿地】初识python脚本 #千万别看,我怕你控制不住...
  10. String和StringBuffer与StringBuilder的区别
  11. java爬虫技术怎么学_java网络爬虫基础学习(四)
  12. 获取a标签的文本 asp.net_Python小程序2获取href的值
  13. AD封装库的下载与导入
  14. 华为荣耀9升降级系统 | 华为荣耀9变砖后如何救砖 | 华为荣耀9获取BL解锁码以及如何解BL锁 | 华为荣耀9如何通过写ramdisk.img来获取root
  15. html页面通过id在页面内跳转,HTML跳转到页面指定位置的几种方法
  16. 永洪科技怎么样_永洪科技面试总结--多位分享经验
  17. re学习笔记(90)攻防世界 - mobile进阶区 - boomshakalaka-3
  18. 62道开发人员面试经典题
  19. 小程序下载图片、文件、wx.downloadFile,废话少说直接上代码
  20. 静态方法 和静态变量——Java

热门文章

  1. python基本操作(四)
  2. Eclipse注释模板设置详解
  3. HackerRank and MiniMax
  4. 在win7在结构cocos2d-x v3.2rc0开发环境(For Android)
  5. [JSOI2008]最大数maxnumber
  6. 位运算和sizeof运算符
  7. KinectV2+Ubuntu 14.04+Ros 配置
  8. php file取不到手机相册,webuploader移动端选择文件无法打开手机相册的解决办法...
  9. 用python绘制用例图源代码_Python设计模式 - UML - 用例图
  10. 计算机网络协议是网民们签订的合同,关于网络协议,下列__________选项是正确的。A.是网民们签订的合同B.是计算机之间的相互通信需...