kotlin特性之object、apply用法总结
前言
最近试用了下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用法总结相关推荐
- Kotlin特色之object、let、with、run、apply、also函数的使用
前言 相比Java,Kotlin提供了不少高级语法特性.对于一个Kotlin的初学者来说经常会写出一些不够优雅的代码.在Kotlin中的源码标准库(Standard.kt)中提供了一些Kotlin扩展 ...
- Kotlin 特性 语法糖 优势 扩展 高阶 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- boost::hana::apply用法的测试程序
boost::hana::apply用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::apply用法的测试程序 C++实现代码 #include <boost/han ...
- js中call与apply用法
来源:http://blog.csdn.net/sunboy_2050/article/details/6592082 前天去面试,有个gg问了一些js知识,其中有一道call与apply用法的题目, ...
- LinQ To Object 基本用法
LinQ To Object 基本用法 inq的基本语法:var result = from item in container select item; linq获取数据子集: var result ...
- oracle oats 工具讲解,Oracle 21c 新特性:Object Activity Tracking System 对象活动跟踪系统...
Oracle 21c 新特性:Object Activity Tracking System 对象活动跟踪系统 在 Oracle Database 21c 中,OATS 新特性引入进来,OATS 是 ...
- Kotlin中also与apply的区别
Kotlin中also与apply的区别 also和apply的差别主要存在于lambda表达式内context表示方式 also是通过传入的参数(it)来表示 apply是通过this来表示 als ...
- Object.assign()用法讲解
Object.assign()用法讲解 语法: Object.assign(target, -sources) target: 目标对象,sources: 源对象 用于将所有可枚举属性的值从一个或多个 ...
- ES6之Object.assign()用法,Object.assign()到底是浅拷贝还是深拷贝?
基本用法 Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). const target = { a: 1 }; const sou ...
最新文章
- Cannot resolve method 'getParameter( )'
- 数据集轻松按需搜索,这个工具汇集近2000个图像数据集,可免费获取|Reddit高热...
- 图解虚拟机中CentOS安装使用和编程
- Python并发编程—进程
- java BigDecimal去掉小数点后的零
- java 逐行写入csv_go|使用go读写CSV文件
- strstrsubstr、AfxGetApp
- 环境变量_Jenkins流水线环境变量权威指南
- python字符串连接数字电视_【学习猿地】初识python脚本 #千万别看,我怕你控制不住...
- String和StringBuffer与StringBuilder的区别
- java爬虫技术怎么学_java网络爬虫基础学习(四)
- 获取a标签的文本 asp.net_Python小程序2获取href的值
- AD封装库的下载与导入
- 华为荣耀9升降级系统 | 华为荣耀9变砖后如何救砖 | 华为荣耀9获取BL解锁码以及如何解BL锁 | 华为荣耀9如何通过写ramdisk.img来获取root
- html页面通过id在页面内跳转,HTML跳转到页面指定位置的几种方法
- 永洪科技怎么样_永洪科技面试总结--多位分享经验
- re学习笔记(90)攻防世界 - mobile进阶区 - boomshakalaka-3
- 62道开发人员面试经典题
- 小程序下载图片、文件、wx.downloadFile,废话少说直接上代码
- 静态方法 和静态变量——Java
热门文章
- python基本操作(四)
- Eclipse注释模板设置详解
- HackerRank and MiniMax
- 在win7在结构cocos2d-x v3.2rc0开发环境(For Android)
- [JSOI2008]最大数maxnumber
- 位运算和sizeof运算符
- KinectV2+Ubuntu 14.04+Ros 配置
- php file取不到手机相册,webuploader移动端选择文件无法打开手机相册的解决办法...
- 用python绘制用例图源代码_Python设计模式 - UML - 用例图
- 计算机网络协议是网民们签订的合同,关于网络协议,下列__________选项是正确的。A.是网民们签订的合同B.是计算机之间的相互通信需...