Kotlin语言主要有以下几个特点:
高度兼容Java:Kotlin也可以调用传统Java语言的各种类库。由于最终都是编译为JVM字节码运行,Kotlin可以与Java存在于同一个项目中,互相调用。开发者可以部分改造项目中的代码,尝试其新语言特性。官方提供Java代码到Kotlin代码的转换工具。开发者可以把现有的Java/Android项目一键转换为Kotlin项目,实现零成本的改造。
代码简洁高效:语法精炼,无处不在的类型推断,自动生成通用方法,支持Lamda表达式,使Kotlin的代码行数远低于传统Java代码。而代码量的压缩,客观上会提高开发效率。
函数式编程:支持让函数作为参数或者返回的高阶函数用法,支持流式API,支持扩展方法。
常量和变量
可变变量定义:var 关键字
不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)
常量与变量都可以没有初始化值,但是在引用前必须初始化
编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。
val a: Int = 1 // 显式标明类型,立即赋值
val b = 2 // 自动推断出 Int
类型
var c : Int ? = null // 如果没有初始值类型不能省略
c = 3 // 明确赋值
类的定义
在Kotlin中所有类都有一个共同的超类Any
Kotlin中也使用class关键字定义类,所有类都继承于Any类,类似于Java中Object类的概念。类实例化的形式也与Java一样,但是去掉了new关键字。
无参构造函数
如果没有构造函数,将会默认一个无参数构造函数
如果主构造函数的所有的参数都有默认值,编译器会生成一个额外的无参构造函数,它将使用默认值。
//如构造函数为私有,需用private修饰
class DontCreateMe public constructor () {
}
class Customer(val customerName: String = “”){}
主构造函数
带有类名的为主构造函数(只有一个)
主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块
主构造函数中声明的属性可以是可变的(var)或只读的(val)
//如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在constructor前面:
class Customer public @Inject constructor(name: String) { …… }
//无修饰可不写constructor关键字
class Customer (name: String) {
var a :Int = 1
init{……}
}
次构造函数
不带类名并且有constructor关键字修饰的函数为次构造函数(可以一个或多个),并且只能存在主构造函数代码块之内
//如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数用 this 关键字即可:
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
继承父类及实现借口
//:在这代表继承或实现
class DemoEntity:BaseEntity(),Serializable {
var title : String?=null
}
重要关键字
Any
在Kotlin中所有类都有一个共同的超类Any,Any并不是Object
open
修饰类:表示能被继承
修饰方法:表示需要重写
final、open、abstract、override对比
修饰符 相应类的成员 注解
final 不能被重写 在kotlin中默认所有的方法和类都是final属性
open 可以被重写 需要被明确指出
abstract 必须要重写 不能被实例化,默认具有open属性
override 覆写超类的方法 如果没有被指定为final,则默认具有open属性
companion 伴生对象
//可以省略Factory
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
val instance = MyClass.create()
内部类和匿名内部类
内部类
//如果需要调用成员变量,需要用inner修饰内部类
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
匿名内部类
//匿名内部类
textView.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
//…
}
})
字符串模板
val book = Book(“Thinking In Java”, 59.0f, “Unknown”)
val extraValue = “extra”
Log.d(“MainActivity”, “book.name = b o o k . n a m e ; b o o k . p r i c e =