Kotlin初探
Posted 码个蛋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin初探相关的知识,希望对你有一定的参考价值。
作者博客
http://www.jianshu.com/u/d5b531888b2b
前言
Kotlin是一种在Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言。
目录
优势
配置
示例
Hello World!
声明类型
函数
操作符
数组遍历及控制语句
类与枚举
扩展
代理
伴生对象
单例模式
扩展学习
优势
简洁
它大大减少你需要写的样板代码的数量。
安全
避免空指针异常等整个类的错误。通用
构建服务器端程序、android 应用程序或者在浏览器中运行的前端程序。互操作性
通过 100% Java 互操作性,利用 JVM 既有框架和库。
2
配置
在我们的AndroidStudio开发工具中,要想使用Kotlin这个优秀的开发语言,我们需要安装插件,直接在安装插件界面搜索Kotlin然后安装。之后再gradle文件增加如下配置:
![Kotlin初探](https://image.cha138.com/20210401/920ad92688a3430ebd20edef83ff0e6e.jpg)
项目gradle文件:
![Kotlin初探](https://image.cha138.com/20210401/e436b101479e4a35a3a17aed90812f13.jpg)
完成上面的配置后,我们就可以愉快的玩耍了。
3
示例
首先我们还和以前一样,创建一个Android项目,自动创建一个Activity之后我们再创建一个java类:
![Kotlin初探](https://image.cha138.com/20210401/55c6260ec628427a895a8f9f67226d82.jpg)
![Kotlin初探](https://image.cha138.com/20210401/1737f7cc764c408fb6487e59ba0b1f0d.jpg)
那上面的代码如果用kotlin实现是什么样子呢。尽管现在我们还不能写出Kotlin代码,但是在安装插件后AS中提供了自动转换Kotlin代码的功能
![Kotlin初探](https://image.cha138.com/20210401/520158c3cbfa4f07959b07074254199f.jpg)
转换后的Kotlin代码
![Kotlin初探](https://image.cha138.com/20210401/c0eb8ba4088e4ccaa254fb861f5ec966.jpg)
![Kotlin初探](https://image.cha138.com/20210401/1af42c6d9743461aa46d2e1c1445930a.jpg)
注意:AS提供的java代码自动转换功能,我们不要轻易使用,更不要转化我们成熟的项目,如果需要就需要我们自己去重构实现。否则会有意向不到的事情等着你,毕竟转换不是那么智能。上面的代码只是让你先简单熟悉下Kotlin代码时什么样子的,接下来我们先去学习一下Kotlin的基本语法。相信很容易上手。
4
Hello World!
我们由一个简单的"Hello World!"输出程序开始。与新建java文件类似,如下图,我们选择Kotlin File/Class.创建一个Kotlin文件。
![Kotlin初探](https://image.cha138.com/20210401/6d135a1e74704e1194ff69bc836e0f86.jpg)
![Kotlin初探](https://image.cha138.com/20210401/6e2695fbb2de460eb8ffe640a495789a.jpg)
上述代码就是简单的输出一个字符串“HelloWorld”,package 后面跟的是包名,我们看出了和java文件的区别,在包名后面没有以分号“;”结尾。在Kotlin语法中,语句结尾都不在有分号“;”。
在Kotlin中变量声明有两种类型,val修饰变量是只读变量即只能赋值一次,再次赋值时就会编译错误
,如果我们需要多次修改值就需要使用var。在上面的 var str: String = ""中,str是变量名,:String,表明该变量是String类型变量,后面就是赋值语句。我们也可以这样写var str= ""省略了生命变量类型,它可以根据赋的值而自动推断出类型。如果我们使用下面赋值语句str=null,发现null是不能赋值的,这就是Kotlin的特性,如果我们想赋值null,可以修改为 var str:String?=""。
fun就是函数生命,而这个main函数就和我们java中的main方法一样,是程序执行的入口。println就是一个打印输出。
5
声明类型
在Kotlin中有如下几种Number类型,他们都是继承自Number抽象类。
Float(32位),Double(64),Int(32),Byte(8),Short(16),Long(64,类型用大写L,如12L),Any(任意类型),数组类型Array<T> 根据传入的泛型数据自动匹配类型,Kotlin还提供了指定类型的Array,如ByteArray,CharArray,ShortArray,IntArray,LongArray,FloatArray,DoubleArray,BooleanArray。在数组类型中都提供了get(index),set(index,value)及iterator()方法供我们使用。
6
函数
我们先来实现一个简单的数值求和的函数,通用实现方法如下:
![Kotlin初探](https://image.cha138.com/20210401/42550019a7ad4cdb9d2ae368a3c291e7.jpg)
传入两个Int型数值,sum是函数名,括号后面的:Int表示该函数返回Int的值,函数体中对两个数字相加并返回。在Kotlin中表达式也可以作为函数体,编译器可以推断出返回类型,可以简化为
![Kotlin初探](https://image.cha138.com/20210401/3768b3d926b84aa6a86864a1122d1e04.jpg)
为了更好理解表达式可以作为函数体,我们可以创建一个函数获取两个数的最大值,如下:
![Kotlin初探](https://image.cha138.com/20210401/434723a2f7b94ee79bae1ff4421f8e7d.jpg)
需要注意的是若if后有多个表达式,如下:
![Kotlin初探](https://image.cha138.com/20210401/9d6a81347e104289ab89eb2580021586.jpg)
括号中的表达式顺序决定了返回的值及其类型。
如果我们的方法体仅仅是打印字符串,并不返回值则:
![Kotlin初探](https://image.cha138.com/20210401/9bba3d73984741e7a4a7a4f4bf5df030.jpg)
Unit就类似我们java中的void,即没有返回值,此时我们可以省略
![Kotlin初探](https://image.cha138.com/20210401/3bd7371c19d74568bf58fbbb71bac9f4.jpg)
对于函数体,方法或者类等和java一样也有一些修饰符,如下
abstract //抽象类标示
final //标示类不可继承,默认属性
enum //标示类为枚举
open //类可继承,类默认是final的
annotation //注解类
private //仅在同一个文件中可见
protected //同一个文件中或子类可见,不可修饰类
public //所有调用的地方都可见
internal //同一个模块中可见,若类不加修饰符,则默认为该修饰符,作用域为同一个应用的所有模块,起保护作用,防止模块外被调用。
7
操作符
直接上代码如下:
![Kotlin初探](https://image.cha138.com/20210401/abff26e61597461dbbf8a24e41fe4a06.jpg)
输出信息为:
![Kotlin初探](https://image.cha138.com/20210401/1e98e8f6378443368e64096b1d8abf1a.jpg)
在上面的部分操作符可达到逻辑操作符, 当我们使用Boolean时,or() 相当于 ||,and() 相当于 &&, xor() 当操作符两边相反时为true,否则为false ,not()时取反。
操作符::
8
数组遍历及控制语句
遍历数组
![Kotlin初探](https://image.cha138.com/20210401/d66aaaa1ffdf4252a17c637dc4ae8d04.jpg)
使用when判断类型
![Kotlin初探](https://image.cha138.com/20210401/e48e9d3b1b264e5dac88bbfdaa02d5cb.jpg)
is 和java中instanceof是一个作用判断是否为某个类型。!is即判断不是某个类型。
![Kotlin初探](https://image.cha138.com/20210401/0b063937c1094a7caaca26c0e9495aae.jpg)
倒序输出是downTo
![Kotlin初探](https://image.cha138.com/20210401/350c0d47f5824602a23394c94426888d.jpg)
9
类与枚举
![Kotlin初探](https://image.cha138.com/20210401/6a4a65bb8d03448e9ca3402dead8c2d4.jpg)
数据类用来保存数据,类似于POJO类,使用data关键词进行定义,编译器默认会为数据类生成以下四个方法
equals()
hashCode()
toString()
copy()
通过数据类你会看到Kotlin的简洁性,我们创建一个Staff类,有String类型的name,position和泛型T(使用泛型仅仅是为了在Kotlin中接触以下泛型)
java实现代码:
![Kotlin初探](https://image.cha138.com/20210401/710026cafc8443c9b084b1fc658adc0c.jpg)
Kotlin数据类:
![Kotlin初探](https://image.cha138.com/20210401/b1c55d548bf24e6f96abce3f065e56dd.jpg)
通过对比我们就看出了优点了,一行代码就实现了,具体使用
![Kotlin初探](https://image.cha138.com/20210401/4bb8e814a8ba44029260df61c72a0625.jpg)
要获取某个属性如获取名字staff.name,赋值就是staff.name="code4Android2",既然说了这样可以赋值,但是动手的小伙伴说为什么我敲的报错啊,如下:
![Kotlin初探](https://image.cha138.com/20210401/2f46e790dbc24d5a9ac48671ff580b6d.jpg)
编译报错了,在前面我们说过val修饰的属性只能赋值一次,那在这里val修饰的属性我们是不能再次赋值的。
上面使用了字符模板,在Kotlin中有两种字符模板形式,$<变量>、${<变量>}
![Kotlin初探](https://image.cha138.com/20210401/d1b498c8620444399170b2d6c974b30f.jpg)
![Kotlin初探](https://image.cha138.com/20210401/81847b99df504af089ed4f40f40e1d0c.jpg)
枚举
![Kotlin初探](https://image.cha138.com/20210401/0a721946d4c342c38bedfb34810af49a.jpg)
在Kotlin中枚举还支持方法。
10
扩展
![Kotlin初探](https://image.cha138.com/20210401/3229cc38e339460eb5bd2f1a524c357f.jpg)
![Kotlin初探](https://image.cha138.com/20210401/d4ecf649c60248878905d464c805f7d1.jpg)
使用
![Kotlin初探](https://image.cha138.com/20210401/425ec1e598fe45658d95c0d662ff0b72.jpg)
11
代理
12
伴生对象
伴生对象(companion object )类似于java中的静态关键字static。在Kotlin没有这个关键字,而是伴生对象,具体用法
![Kotlin初探](https://image.cha138.com/20210401/20a3158d31694a6aa67ad7d81860fb2d.jpg)
使用的话直接People.ID。
13
单例模式
在Kotlin中使用object修饰类的时候,该类是单例对象。
好了,今天就介绍到这里,文中若有错误欢迎指出,Have a wonderful day.
14
扩展学习
Kotlin英文官网
http://kotlinlang.org/
Kotlin学习中文官网
https://www.kotlincn.net/
在线学习示例
http://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt
以上是关于Kotlin初探的主要内容,如果未能解决你的问题,请参考以下文章