Kotlin是JetBrains公司开发的一个语言,具有以下特性。
1、使用IntelliJ IDEA。这是JetBrains旗下的产品,能够很好的支持Kotlin语言。
2、使用在线网址运行Kotlin代码:https://play.kotlinlang.org/。
3、使用Android Studio。但是该IDE只支持创建Android项目,不支持创建Kotlin项目。现在Kotlin语言被广泛的应用于android开发,并被推荐称为官方开发语言,使用Android Studio结合Kotlin语言开发移动端应用是Kotlin应用最多的场景。
Kotlin中只有两种变量声明关键字:val和var。
验证var与val的区别,考虑以下代码:
val a = 10
a = a + 1
此时,第二行语句会提示一个编译错误“Val cannot be reassigned”,val类型的变量不能够被重新分配,这里验证了val变量的不可变类型,它相当于Java语言中的final关键字修饰的变量,第一次赋值后不可改变。对于val和var的使用,永远是优先使用val类型的,当变量确实需要改变的时候,再将其改成var类型。
Kotlin语言和Java一样是一种静态类型的语言,这意味着所有表达式的类型在编译期已经确定了,包括变方法和字段引用。但是只有两种声明变量的关键字,那么又是怎么实现变量有确定类型的呢?Kotlin拥有出色的类型推导机制,能够推导出正确的数据类型。
fun main() {
val a = 10
println("a = " + a)
}
Kotlin语法是每一行的结尾不需要加分号。这里给不可变变量a赋值一个值,该值是一个整型的变量,会被推导成一个Int型的变量。
但是,类型推导并不是总是可以正常工作的,比如在延迟初始化的时候
val a : Int
a = 10
变量a并未在声明的时候重新赋值,而是在延迟赋值,此时直接写val a是不合法的。会提示“This variable must either have a type annotation or be initialized”,该变量必须规定一个类型或进行初始化。所以这里需要进行显示的指示变量的类型。
Java中叫方法,Kotlin语言中叫函数,并没有什么区别,只是不同语言的叫法而已。
函数定义
fun 函数名(参数名:参数类型 ...) : 返回值类型
例子:
fun getLargeNumber(num1:Int, num2:Int) : Int {
return max(num1, num2)
}
函数使用fun关键字进行定义,返回值写在最后。
fun getLargeNumber(num1:Int, num2:Int) : Int = max(num1, num2)
当函数中的代码只有一行时,可以允许不必编写函数体,直接等式连接。
1、if
与其他语言的if使用方法相同,搭配else一起使用。
fun getLargeNumber(num1: Int, num2: Int): Int {
var value = 0
if (num1 > num2) {
value = num1
} else {
value = num2
}
return value
}
但是也有不同的地方,Kotlin语言中的if语句是一个表达式,他可以作为返回值直接返回。
fun getLargeNumber(num1: Int, num2: Int): Int {
var value = if (num1 > num2) {
num1
} else {
num2
}
return value
}
如果函数中只有if,可以用一行进行返回
fun getLargeNumber(num1: Int, num2: Int): Int = if(num1 > num2) num1 else num2
2、when
当if分支很多时,在Java中可以使用switch语句,但是switch有局限性,只能支持整型或短于整型和字符串类型的。when语句有点类似于switch语句,但是比switch语句强大得多。
when(参数) {
匹配值 -> {执行逻辑}
...
}
需要注意的是,when语句也是有返回值的。除此之外,when语句还允许进行类型匹配。
fun checkNumber(num: Number) {
when (num) {
is Int -> println("number is Int")
is Double -> println("number is Double")
else -> println("number not support")
}
}
is关键字用于匹配是否是该类型或其子类型,与Java中的instanceof关键字相当。而Number类是Kotlin的一个内置的抽象类,所有数字相关的类都是其子类。
Kotlin中判断字符串或对象可以直接使用==关键字,而不用像Java那样调用equals方法。
Kotlin提供了像Java中的while和for循环。同时将for-each循环进行了加强,提供了一种for-in循环。
在Kotlin中有一个新的概念:区间
val range = 0..10
该区间表示的是一个闭区间。除此之外,还可以是用关键字来创建单闭区间和跳过元素。
val range = 0 until 10
until关键字创建一个左闭右开的区间
for (i in 0 until 10 step 2) {...}
使用step可以跳过一些元素。
for (i in 10 downTo 1) {...}
上面的都是升序的空间,可以使用downTo关键字创建一个降序的空间。
Kotlin是一门面向对象编程的语言,也存在类、对象、多态等概念。
class Person {
var name = ""
var age = 0
}
使用class关键字创建一个类。
val p = Person()
需要注意的是,Kotlin中创建对象不需要像Java中使用new关键字。
在Kotlin中任何一个非抽象类默认是不可以被继承的,相当于Java中被申明为final的类。如果想要继承一个类,那么父类需要使用open关键字进行修饰。
open class Person{}
此时,Person类就可以被继承了
class Student : Person() {
...
}
使用冒号继承,后面的括号就是调用父类的构造函数,由于之前的Person类没有定义构造函数,所以这里调用的是父类的无参构造函数。这一方面与Java相同,子类的构造函数必须调用父类的构造函数对父类进行初始化。
Kotlin中将构造函数设计的比较复杂,可以分为两种:主构造函数和此构造函数。
class Student(val sno: String, val grade: Int) : Person() {...}
此时,Student类就没有了无参主构造函数,在对Student类实例化的时候必须传入参数。
在Java中的构造函数中,有时会写入一些逻辑,但是现在在Kotlin的主构造函数中没法写入逻辑,Kotlin中提供了一个init结构体,可以在里面写入逻辑。
class Student(val sno: String, val grade: Int) : Person() {
init {
...
}
}
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
constructor(name: String, age: Int) : this("", 0, name, age) {}
constructor() : this("", 0) {}
}
次构造函数使用constructor关键字定义,这里通过this关键字调用自己的主构造函数。第二个次构造函数通过调用第一个次构造函数也间接的调用了主构造函数。
注意事项:
Kotlin接口和Java的接口几乎完全一致,使用interface进行修饰。
interface Study {
fun readBooks()
fun doHomework()
}
在Java中实现接口使用implements关键字,二Kotlin中使用冒号,中间使用都好进行分隔。
除此之外,接口中允许有函数体,一个函数有了函数体,这个函数体中就是它的默认实现。
Java中有四种方法修饰符,Kotlin中也有四种函数修饰符。public、private、protected和internal。private也是只对当前类可见,public也是对所有类可见,但是不同的是,在Kotlin中,public修饰符是默认修饰符,而在Java中default是默认修饰符。protected在Java中对当前类、子类和同包可见,而Kotlin中只表示当前类和子类可见。Kotlin中没有default,internal表示同一模块可见。
在Java中,数据类和单例类是常写的类类型。
1、单例类
单例是一种设计模式,在Java中需要自己去实现,有多种实现方式。而在Kotlin中创建单例类极其简单,只需要将class关键字换成object关键字,此时该类就只能有一个对象存在。
object Singleton {
fun SingletonTest(){...}
}
单例类的调用类似于Java中的静态方法调用
Singleton.SingletonTest()
2、数据类
数据类通常占据着重要的角色,用于将服务器端或数据库中的数据映射到内存中,为编程逻辑提供数据模型的支持。像MVC、MVP等架构中的M通常就指数据类。
数据类通常需要重写equals、hashCode、toString这几个方法。其中equals方法用于判断两个数据类是否相等。hashCode方法作为equals的配套方法,也需要一并改写,否则HashMap、HashSet等hash相关的类无法正常工作。
数据类使用data进行修饰
data class CellPhone(val brand: String, val price: Double)
Kotlin会根据主构造函数中的参数帮你将equals、hashCode、toString等固定的方法进行自动生成。