Kotlin 基础:
函数声明:
- 声明函数要⽤ fun 关键字
- 「函数参数」的「参数类型」是在「参数名」的右边
- 函数的「返回值」在「函数参数」右边使⽤ : 分隔,没有返回值时可以省略
声明没有返回值的函数:
fun main() {
//..
}
声明有返回值的参数:
fun sum(x: Int, y: Int): Int {
return x + y
}
变量声明:
- 声明变量需要通过关键字: var 声明可读可写变量; val 声明只读变量
- 「类型」在「变量量名」的右边,⽤ : 分割,同时如果满⾜「类型推断」,类型可以省略
- 创建对象直接调⽤构造器,不需要 new 关键字
声明可读可写变量:
var age: Int = 18
声明只读变量:
val name: String = "Hello, Kotlin!"
声明对象:
val user: User = User()
类型推断:
var age = 18
val name = "Hello, Kotlin!"
val user = User()
继承类/实现接⼝:
继承类和实现接⼝都是⽤的 : 继承的类在后面要追加()括号,实现的接口不需要追加()括号
class MainActivity : BaseActivity(), View.OnClickListener
空安全设计:
Kotlin 中的类型分为「可空类型」和「不可空类型」:
- 不可空类型
val editText : EditText
- 可空类型
val editText : EditText?
调⽤符:
- !! 强⾏调⽤符
- ?. 安全调⽤符
lateinit 关键字:
- lateinit 只能修饰 var 可读可写变量(因为它只是延迟初始化)
- lateinit 关键字声明的变量的类型必须是「不可空类型」
- lateinit 声明的变量不能有「初始值」
- lateinit 声明的变量不能是「基本数据类型」
- 在构造器中初始化的属性不需要 lateinit 关键字
平台类型:
- @Nullable 表示可空类型
- @NotNull @NonNul l 表示不可空类型
类型判断:
- is 判断属于某类型
- !is 判断不属于某类型
- as 类型强转,失败时抛出类型强转失败异常
- as? 类型强转,但失败时不会抛出异常⽽是返回 null
获取 Class 对象:
- 使⽤ 类名::class 获取的是 Kotlin 的类型是 KClass
- 使⽤ 类名::class.java 获取的是 Java 的类型
setter/getter:
var code: String? = null
set(value) {
field = value
}
get() {
return field;
}
val newEditable = Editable.Factory.getInstance().newEditable("Kotlin")
et_username.text = newEditable
不写set、get函数时,kotlin会默认生成一个公共的set、get函数,如果想要修改某一个set\get的可见性,需要在变量的下面声明可见性 [修饰符] set\get
下面这个示例代码,set函数为private,get函数默认为publick var code: String? = null private set
构造器:
使⽤ constructor 关键字声明构造器
class User {
constructor()
}
//在单参数的构造函数里,主动调用了双参数的构造函数
constructor(context: Context) : this(context, null)
// 双参数构造函数主动调⽤⽤了⽗类的构造器
constructor(context: Context, attr: AttributeSet?) : super(context, attr)
构造器的完整写法:
class CodeView : TextView {
constructor(context: Context): super(context)
}
构造器的简化写法:
class CodeView constructor(codeView: Context) : TextView(codeView) {
/.../
}
如果没有被「可⻅性修饰符」「注解」标注,那么 `constructor` 可以省略
class CodeView(codeView: Context) : TextView(codeView) {
/.../
}
构造器的简化写法不能包含任何初始化代码,初始化代码可以放到 init 代码块中
class CodeView(var codeView: Context) : TextView(codeView) { init { /.../ } }
在初始化的时候,初始化块会按照它们在「⽂件中出现的顺序」执⾏。
class CodeView(var codeView: Context) : TextView(codeView) { init { /.../ } val paint = Paint() // 会在 init{} 之后运⾏ }
在构造器的简化写法参数前⾯加上 var/val 使构造参数同时成为成员变量
构造函数的变量不加变量修饰符,默认只能成员变量赋值时访问 class CodeView(codeView: Context) : TextView(codeView) { val color = codeView.getColor(R.color.colorWhite) } 加了变量修饰符后,使其成为成员变量 class CodeView(var codeView: Context) : TextView(codeView) { val color = codeView.getColor(R.color.colorWhite) fun test() { codeView.getColor(R.color.colorWhite) } }
@JvmField ⽣成属性:
@JvmField
var value: String = "1";
Any 和 Unit:
- Any: Kotlin 的顶层⽗类是 Any ,对应 Java 当中的 Object ,但是⽐ Object 少了 wait()/notify() 等函数
- Unit: Kotlin 中的 Unit 对应 Java 中的 void
数组:
使⽤ arrayof() 来创建数组,基本数据类型使⽤对应的 intArrayOf() 等;
val codeList = arrayOf("1", "2", "3")
val intList = intArrayOf(1, 2, 3)
静态函数和属性:
- 顶层函数; 生成真正的静态函数,但是在同一个层级包下,不能生成同名的静态函数
- object; 类名用object来修饰;代表生成单例对象,在kotlin中跟Java中调用静态函数的方式是一样的,但实际上是通过单例对象来调用函数;在Java中调用需要用类名.INSTANCE.方法名();
- companion object; 类名如果是用class修饰的对象,可用该关键词在类里面生成伴生对象,生成后的对象为单例对象,在kotlin中跟Java中调用静态函数的方式是一样的,但实际上是通过单例对象来调用函数;在Java中调用需要用类名.Companion.方法名();
- @JvmStatic; 通过这个注解将 object 和 companion object 的内部函数和属性,真正⽣成为静态的。
- 需要注意,这种顶层函数不要声明在 module 内最顶层的包中,⾄少要在⼀个包中例如 com 。不然不能⽅便使⽤。
package com.example.myapplication.kt
fun test() {
}
顶层函数的调用:
文件名为:
TestKt.kt
kotlin中调用:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
test()
}
Java中调用:
TestKtKt.test();
object函数声明:
object TestKt {
fun test1() {
}
}
object函数调用:
文件名为:TestKt.kt
Kotlin调用:
TestKt.test1()
Java中调用:
TestKt.INSTANCE.test1();
companion object函数声明:
class TestKt {
companion object{
fun test1() {
}
}
}
companion object函数调用:
文件名为:TestKt.kt
Kotlin调用:
TestKt.test1()
Java中调用:
TestKt.Companion.test1();
@JvmStatic函数声明:
class TestKt {
companion object{
@JvmStatic
fun test1() {
}
}
}
or
object TestKt {
@JvmStatic
fun test1() {
}
}
@JvmStatic函数调用:
文件名为:TestKt.kt
Kotlin调用:
TestKt.test1()
Java中调用:
TestKt.test1();
单例模式/匿名内部类 :
findViewById<Button>(R.id.button_id).setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
} )
}
字符串:
字符串模版:
val number = 100
val text = "向你转账${number}元。"
// 如果只是单⼀的变量,可以省略掉 {}
val text2 = "向你转账$number元。"
多⾏字符串:
val s = """
我是第⼀⾏
我是第⼆⾏
我是第三⾏
""".trimIndent()
区间:
200..299 表示 200 -> 299 的区间(包括 299 )
when 关键字:
Java 当中的 switch 的⾼级版,分⽀条件上可以⽀持表达式。
受检异常:
Kotlin 不需要使⽤ try-catch 强制捕获异常
声明接⼝/抽象类/枚举/注解:
抽象属性如果在 接口 中定义一个属性,就代表抽象属性,⼦类对抽象属性重写\继承的时候需要实现对应的setter/getterclass TestKt :CodeView { override val test: String get() = "111" } interface CodeView { val test: String }
静态常量:
静态常量,也叫做编译期常量,在静态变量(顶层函数\object\companion object\@JvmStatic)上加上 const 关键字变成编译期常量。
顶层声明静态常量:
package com.example.myapplication.kt
const val value = "1"
顶层函数调用静态常量:
文件名:TestKt.kt
Kotlin中调用:
val testValue = value
Java中调用:
String testValue = TestKtKt.value;
object声明静态常量:
object TestKt {
const val value = "1"
}
object调用静态常量:
文件名:TestKt.kt
Kotlin中调用:
val testValue = TestKt.value
Java中调用:
String testValue = TestKt.value;
companion object声明静态常量:
class TestKt {
companion object{
const val value = "1"
}
}
companion object调用静态常量:
文件名:TestKt.kt
Kotlin中调用:
val testValue = TestKt.value
Java中调用:
String testValue = TestKt.value;
companion object用@JvmStatic声明静态常量:
class TestKt {
companion object {
@JvmStatic val value = "1"
}
}
companion object用@JvmStatic调用常量:
文件名:TestKt.kt
Kotlin中调用:
val testValue = TestKt.value
Java中调用:
String testValue = TestKt.Companion.getValue();
object用@JvmStatic声明静态常量:
object TestKt {
@JvmStatic
val value = "1"
}
object用@JvmStatic调用常量:
文件名:TestKt.kt
Kotlin中调用:
val testValue = TestKt.value
Java中调用:
String testValue = TestKt.getValue();
获取⽬标类引⽤:
- 在 Java 中通过「类名.this 例如 Outer.this 」 获取⽬标类引⽤
- 在 Kotlin 中通过「this@类名 例如 this@Outer 」获取⽬标类引⽤
遍历:
for(item in items)
通过标准函数 repeat() :
循环100次 repeat(100) { //.. }
通过区间:for (i in 0..99) { } // until 不包括右边界 for (i in 0 until 100) { }
嵌套类:
可⻅性修饰符:
注释:
注释中可以在任意地⽅使⽤ [] 来引⽤⽬标,代替 Java 中的 @param @link 等。
⾮空断⾔:
可空类型强制类型转换成不可空类型可以通过在变量后⾯加上 !! ,来达到类型转换。
var value: String? = null
var value1 :String = value!!
open/final:
Kotlin中的类和函数,默认是被 final 修饰的 ( abstract 和 override 例外)。除非在类型修饰符\函数修饰符前面加上 open 关键词,代表不用final修饰。