秒懂Kotlin之Java工程师快速掌握Kotlin的技巧_第1页
秒懂Kotlin之Java工程师快速掌握Kotlin的技巧_第2页
秒懂Kotlin之Java工程师快速掌握Kotlin的技巧_第3页
秒懂Kotlin之Java工程师快速掌握Kotlin的技巧_第4页
秒懂Kotlin之Java工程师快速掌握Kotlin的技巧_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第秒懂Kotlin之Java工程师快速掌握Kotlin的技巧Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,由JetBrains设计开发并开源。

Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。

在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言。

Kotlin/JVM可以看做是对改进Java的一种积极的尝试,其试图改进Java编程语言中已知的被广泛讨论的缺点与不足。因为我多年前从事过C#的开发,初次看到Kotlin,感觉好多特性C#好多年前就有了。足见Java是多么的传统,不愿意过多的引入语法糖。

关于Kotlin与Java的爱恨情仇此处按下不表,等有机会单独写一篇相关文章。本文仅想从Java惯用者的角度给出Kotlin与Java的一些不同点,这往往对Java惯用者迅速掌握Kotlin是至关重要的。因为Kotlin是对Java的一种改进,其与Java是100%互操作的,所以Java程序员经过短暂的熟悉后往往可以快速入门,进而熟练掌握Kotlin。

人类学习新事物的一个很重要的方法就是类比,如果新事物与旧事物相似性非常大,那么类比学习的效果会更加明显,从Java到Kotlin非常符合这个特征,以你熟悉的Java来类比不熟悉的Kotlin将会事半功倍,让我们开始吧。

本文基于Kotlin1.4.0版本

Kotlin与Java在语法上存在一些差异,不算特别巨大,下面列出了我认为最需要适应的几条:

Kotlin中的方法和属性可以不包含在类中

我们知道,Java中的一切是以class为基础的,都要在class中,但是Kotlin却不是。下面的代码中,方法、属性以及类共存于同一级,同一个文件中都是允许的。

varname:String="ShuSheng007"

funsum(x:Int,y:Int):Int{

returnx+y

classStudent{}

Kotlin中语句不需要以;结束

println("helloworld")

Kotlin中数据类型是后置的

//变量声明时类型后置

varname:String="ShuSheng007"

//方法参数及返回值类型后置

funsum(x:Int,y:Int):Int{

returnx+y

}

Kotlin方法使用fun关键字定义

funsum(x:Int,y:Int):Int{

returnx+y

}

Kotlin的类和方法默认是publicfinal的

类默认不可以被继承,基类中的方法默认不可以被重写,如果想要被继承或者重写需要用open关键字标记

//Human类可以被继承

openclassHuman{

//eat方法可以被overwrite

openfuneat(){

}

Kotlin中类继承和接口实现使用:标记

//类继承

classMan:Human(){

overridefuneat(){

super.eat()

//实现接口

interfaceaction{

funsleep()

classWoman:action{

overridefunsleep(){

//...

}

Kotlin中使用var,val声明变量及属性,而且可以进行类型推断

在Java中,我们声明一个变量必须先指定其类型,例如

Stringname="shusheng007";

但是在Kotlin中,编译器可以根据赋值自动推断其类型为String

varname="shusheng007"

Kotlin存在非空与可空类型

这个也是其宣传的一大亮点,尝试去解决价值几十亿美金的问题:NullPointerException

在Kotlin中每个对象默认都是非null的,除非你显式的将其声明为可null

//非空类型

varname1:String="shusheng"

//可空类型

varname2:String=null

Kotlin中package可以与文件路径不一致

什么意思呢?假设我们有个类文件在src/…/top/ss007/learn文件路径中

那么对于Java此类的包名必须为

packagetop.ss007.learn

而对于Kotlin来说就没有这个限制,可以随便叫,例如叫:就是这么任性

packagejust.so.wayward

确实挺任性的,所以这点建议还是遵守Java的规范更好。

Kotlin中没有受检异常(CheckedException)

在Java中有很多受检查异常,程序员被强制要求处理它,或者抛给下层调用者处理。但是Kotlin没有这个限制。

Kotlin强调不可变的概念

Kotlin会优先使用不可变对象,例如不可变的集合,不可变的变量。这些不可变对象生成后就只能读取,而不能修改。至于使用不可变对象有很多好处,例如其天然的线程安全性等

以上几条是个人认为的最颠覆我们认知的差异点,熟悉了上面几条后Java程序员就基本上可以看得懂kotlin的代码了

Java中不存在的特性

Kotlin中引入了很多Java中不存在的特性,下面是几条我认为比较重要的

方法类型(FunctionType)

在Kotlin中方法是一等公民,意思就是方法就和类一样,类可以干的事,方法都可以干。方法竟然可以作为类型当其他方法的参数传递,当其他方法的返回值类型,当变量的声明类型…这个比较颠覆Java程序员的三观,Java中是没有对应的概念的。如果非要找一个对应物的话,那就是函数接口了。

下面是一个方法类型(两个int数据得到一个int,例如1+2=3)。我们完全可以将其看成是java中的一个类,所有可以使用类的地方这家伙都适用,也就是说kotlin中,方法可以当参数传递了,相当于实现了方法引用,牛逼哄哄的。

(Int,Int)-Int

例如如下方法,第3个参数operation的类型就是上面的方法类型

funcalculate(x:Int,y:Int,operation:(Int,Int)-Int):Int{

returnoperation(x,y)

//如何调用

funsum(x:Int,y:Int):Int{

returnx+y

//将sum方法当参数传入了calculate方法中

calculate(4,5,::sum)

//我们也可以使用Lambda表达式

calculate(4,5,{a,b-a+b})

//当Lambda表达式是方法的最后一个参数时,其可以移到()外面

calculate(4,5){a,b-a+b}

那么如何在Java中实现相同的功能呢?

第一步:按照需求定义一个函数接口

下面的接口只有一个抽象方法,是一个函数接口。

@FunctionalInterface

publicinterfaceFun2P1,P2,R{

Rinvoke(P1p1,P2p2);

}

第二步:将其作为方法参数类型

publicintjavaCalculate(intx,inty,Fun2Integer,Integer,Integeroperation){

returnoperation.invoke(x,y);

}

经过上面两步就搞定了。

当在Kotlin中调用Java中的方法javaCalculate时,IDE会提示如下信息

第一条是告诉你第三个参数可以使用Kotlin中的函数类型,代码如下

javaCalculate(4,5){a,b-a+b}

第二条是比较正统的,告知你需要一个类型为Fun2的参数,代码如下

javaCalculate(4,5,object:Fun2Int,Int,Int{

overridefuninvoke(p1:Int,p2:Int):Int{

returnp1+p2

})

在Java中我们使用new一个匿名类的对象,而在Kotlin中我们需要使用object关键字

属性(Property)

varname:String="ShuSheng007"

对应Java类里的私有字段(Field)外加getter和setter方法

privateStringname;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

=name;

}

数据类dataclass

dataclassUser(valname:String,valage:Int)

大体相当于Java中的JavaBean,但有细微差别,这也是Kotlin大势宣传其简洁性时经常展示的看家特性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论