Kotlin学习笔记

1 概述

这篇文章首先会介绍Kotlin的特点,接着介绍Kotlin与Java的语法比较。

2 Kotlin特点

  • 一门现代化的编程语言
  • 可开发跨平台应用,web,Socket,安卓,js,NativeApp等
  • 静态编程语言,性能基本与原声Java相当
  • 100%兼容Java(说是兼容但实际上有些坑,可以戳这里看看)
  • 简洁:跟Java相比真的是简洁很多,语法糖特别舒服
  • 安全:彻底解决写Java基本上都会遇到的著名的NullPointerException问题,结合编译器可以在编译截断发现几乎所有可能存在NPE问题的代码
  • 互操作性:基于JVM,可以直接拿现有的Java库用
  • 工具友好:和JetBrains的IDE结合简直舒服得不要不要的
  • 支持函数式编程:比如Lambda表达式
  • 支持协程:协程像是非常轻量级的县城,协程将复杂性放入库来简化异步编程,逻辑可以在协程中顺序表达,底层库负责解决异步性,很重要的一点是协程挂起不会阻塞其他线程。官方一个demo是开启10w个协程: 在这里插入图片描述
  • 支持扩展函数:类似C#,能够扩展一个类的新功能而无需继承类或者使用装饰者这样的设计模式,Kotlin支持扩展函数和扩展属性
  • 泛型:当然Java也支持泛型,但是Kotlin比Java支持得更好
  • 不依赖XML

下面进入Kotlin的语法部分。

3 基本语法

  • ;结尾
  • println()代替System.out.println();
  • 输出语句中使用$变量名代替Java中的+变量名,比如println("age:$age")而不是System.out.println("age:"+age)
  • 三引号(三个双引号连在一起)中的字符串不会进行转义

4 变量与常量

  • var声明变量
  • val声明常量
  • 可以在var/val后面加上类型,比如val a:Int

在这里插入图片描述 如上图提示val不能被赋值,提示改为varval类似与Java中的final,虽然val引用自身不可变,但是指向的对象是可以改变的。

val只能进行唯一一次初始化,如果编译器能确保只有唯一一条初始化语句被执行,可以根据条件进行不同的初始化操作:

1val a:Int 2if (4>3) 3{ 4 a = 9 5} 6else 7{ 8 a = 10 9}

5 表达式和语句

Java中所有的控制结构都是语句,在Kotlin中除了三大循环(whilefordo while)外,大多数控制结构都是表达式。比如if是表达式而不是语句。也就是说,if有值而不像Java里面一样没有值(语句)。 例子:

1var a = if (3>2) 3 else 2 2 3 4fun main() 5{ 6 var a = max(4,9) 7} 8 9fun max(a:Int,b:Int): Int = if(a>b) a else b

6 枚举

使用enum class而不是Java中的enum

1fun main() 2{ 3 val months = Months.May 4 println(months.days) 5} 6 7enum class Months(val days:Int) 8{ 9 May(31), 10 Jun(30) 11}

7 when

when相当于Java中的switch

1fun main() 2{ 3 val months = Months.May 4 when(months) 5 { 6 Months.May -> print("May") 7 Months.Jun -> print("June") 8 } 9} 10 11enum class Months(val days:Int) 12{ 13 May(31), 14 Jun(30),; 15}

使用->进行了简化。

8 循环

8.1 while与do while

与Java一样。

8.2 for

使用..表示区间,在i前面没有类型:

1for (i in 1..100) 2 print(i)

注意区间是两边都包含的,也就是1..100表示i从1循环到100。

使用下标迭代:

1val arr = arrayListOf("1111","2222","333") 2for ((i,e) in arr.withIndex()) 3 println("$i = $e")

输出:

10 = 1111 21 = 2222 32 = 333

9 类

9.1 构造方法

class Person(val name:String)

不需要像Java一样this.xxx=xxx

9.2 getter/setter

因为val代表常量,而var代表变量,setter是用于改变值的,因此,使用var声明的属性具有getter与setter,使用val声明的属性只有getter。 Kotlin没有提供直接操纵getter与setter的方式,通过使用.属性名进行修改属性或者获取属性:

1class Person 2{ 3 var name = "" 4 val id = "" 5} 6var person = Person() 7person.name="111" 8person.id="222" //编译不通过,id为val不可变

9.3 自定义getter/setter

在相应的属性后面加上get/set即可自定义getter/setter:

1class Person 2{ 3 var name="" 4 get() 5 { 6 return "name"+field 7 } 8 var id="" 9 set(id) 10 { 11 field = id 12 } 13}

get/set中使用field表示字段,比如在上面例子中的get中,field表示name,而在下面的set中,field表示自己的id=后面是参数的id

10 异常

10.1 抛出异常

直接throw,无需new

1val age = 300 2if(age !in 1..100) 3 throw IllegalArgumentException("Out of range:$age")

10.2 try/catch

1try 2{ 3 throw Exception("exception") 4} 5catch (e:Exception) 6{ 7 e.printStackTrace() 8}

10.3 受检异常与不受检异常

Java中的异常有两类:

  • Unchecked Exception:不受检异常,可以不进行try/catch处理,包括Runtime Exception及其子类
  • Checked Exception:受检异常,必须进行try/catch处理或者声明需要抛出,不属于不受检异常的异常都属于受检异常

Kotlin不区分两者,也就是对于Java的受检异常可以不处理,比如:

1fun main() 2{ 3 throw IllegalArgumentException("333") 4}

可通过编译,而Java中的

1public class Test 2{ 3 public static void main(String []args) 4 { 5 throw new Exception("111"); 6 } 7}

则无法通过编译。

11 集合类

1val arrayList = ArrayList<Int>() 2arrayList.add(3) 3arrayList.add(9) 4arrayList.forEach { t-> println(t) } 5 6val hashSet = hashSetOf<String>() 7hashSet.add("2222") 8hashSet.add("99999") 9hashSet.forEach{t-> println(t)} 10 11val list = listOf(3,5,5) 12list.forEach{t-> println(t)} 13 14val map = mapOf("a" to 1,"b" to 2) 15map.forEach{(k,v)-> println("$k to $v")}

可以直接使用集合类或者xxxOf创建,遍历使用forEach与Lambda,Kotlin风格的Lambda使用{}

12 函数

12.1 基本语法

1fun printStr(str:String) 2{ 3 println(str) 4} 5 6fun add(a:Int):Int 7{ 8 return a+3 9}
  • fun声明函数
  • 形参类型在形参名称后
  • 返回类型放在最后,前面需要带
  • 函数不强制放在类中

12.2 默认参数

Java里面没有默认参数,实现类似功能需要重载去解决,而Kotlin的函数可以具有默认参数:

1fun main() 2{ 3 println(add()) 4 println(add(1)) 5 println(add(1,2)) 6} 7fun add(a:Int = 3,b:Int = 4):Int = a+b

可以省略的只有在末尾的参数,也就是默认参数从末尾开始确定默认值。

12.3 命名参数

类似Python,调用函数时使用形参名称与值的方式调用而不是仅仅通过值调用,同时可以结合默认参数省略部分值。

1fun main() 2{ 3 println(add(b=1)) 4 println(add(b=5,a=9)) 5} 6 7fun add(a:Int = 3,b:Int = 4):Int = a+b

12.4 可变参数

使用vararg

1fun main() 2{ 3 println(add(1,2,3,4)) 4} 5 6fun add(vararg a:Int):Int = a.sum()

13 顶层函数与顶层属性

13.1 顶层函数

Kotlin中可以将函数放在代码文件的顶层,不用附属于任何类,但仍然是包内作用域,包外需要import,作用类似Java中的静态函数。

1fun add(vararg a:Int):Int = a.sum() 2fun main() 3{ 4 println(add(1,2,3,4)) 5}

Java中调用顶层函数时可以使用默认的Kotlin文件名作为默认包去调用,也可以使用@file:JvmName修改调用的包名,比如上面的文件名为Test.kt,则Java中调用的代码如下:

TestKt.add()

使用注解后:

1@file:JvmName("Test") 2fun add(vararg a:Int):Int = a.sum 3fun main() 4{ 5 println(add(1,2,3,4)) 6}

Java调用方式改变如下:

Test.add()

13.2 顶层属性

与Java中的静态属性类似,有点像全局变量或全局常量,可以使用varvalconst val修饰:

1var a = 0 2val b = 0 3const val c = 0 4 5fun main() 6{ 7 println(++a) 8 println("$b\n$c") 9 test() 10} 11 12fun test() 13{ 14 println("$a\n$b\n$c") 15}

valconst val的主要区别是:

  • val实质上相当与Java中的private final static
  • const val实质上相当于Java中的public final static
  • const相当于@JvmField,也就是说const val a = 0@JvmField val a = 0等价:

14 参考

1、Kotlin语言的特点和优劣势

2、Java受检异常与不受检异常

3、Kotlin中的getter与setter

4、Kotlin与Java的异同

5、Kotlin之const val与val

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

IntelliJ IDEA 2023 for Mac(Java开发工具)

IntelliJIDEA2023是一款由JetBrains开发的集成开发环境(IDE),主要用于Java和其他编程语言的开发。它支持多种编程语言和技术,包括Java、Kotlin、Scala、Groovy、Android、Spring等等。IntelliJ