kotlin官方学习网站:https://developer.android.google.cn/kotlin/add-kotlin
.kt编译成.java
tools--->kotlin--->Show Kotlin Bytecode-->Decompile
Kotlin 基础语法
1.Var 与 Val
var 关键字: 可变变量 var <标识符> : <类型> = <初始化值> // 可以改,可以读 ?get ?set 如:var info1 : String = "A"
val 关键字: 不可变变量,只能赋值一次的变量(有一点点类似Java中final修饰的变量) val <标识符> : <类型> = <初始化值> // 只能读, 只有 get 如:val info2 : String = "B"
2.函数
//普通函数 返回类型 ?== 类型推导 Int fun add2(number1: Int, number2: Int) = number1 + number2
// 可变参数 (可变长 参数函数)vararg关键字 fun lenMethod(vararg value: Int) { ? ? for (i in value) { ? ? ? ? println(i) ? ? } }
3.字符串模板
?// $ 表示一个变量名或者变量值
?// $varName 表示变量值
?// ${varName.fun()} 表示变量的方法返回值
4.NULL检查机制
? // Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理, ? // 有两种处理方式,字段后加!!像Java一样抛出空异常, 如:var info: String? = null ? ?println(info!!.length)//!! 我自己负责info 不会为null == ?(不管null不null必须执行) ?== ?Java ? ? ?另一种字段后加? 如:var info: String? = null ? ?println(info?.length) ?// ? 如果info是null,就不执行 .length
?// ?: ?如果值为null ?就输出设置的字符串 ?“你很牛逼” 如: var info: String? = null ? ? println(info?.length ? ?: "你很牛逼")//打印值为:你很牛逼
5.区间
// 1 到 9 ? ? for (i in 1..9) { ? ? ? ? // println(i) ? ? }
? ? // 不会输出 ? ? for (i in 9..1) { ? ? ? ? // println(i) ? ? }
? ? // 大 到 小 ? ? for (i in 9 downTo 1) { ? ? ? ? // println(i) ? ? }
? ? // 用区间做判断 ? ? val value = 88 ? ? if (value in 1..100) { ? ? ? ? // println("包了 1 到 100") ? ? }
? ? // 步长指定 ? ? for (i in 1..20 step 2) { ? ? ? ? // 1 3 5 7 ... ? ? ? ? // println(i) ? ? }
? ? // 排除 最后元素 ? ? for (i in 1 until 10) { ? ? ? ? println(i) ? ? }
?比较与数组
1.比较两个值
? ? //比较值本身 == 等价 Java的equals ? ?
? ? // 比较对象地址 ? ===?
2.数组
?// 第一种形式 ? ? val numbers = arrayOf(1, 2, 3, 4, 5, 6, 7, 8) ? ? println(numbers[0]) ? ? ?println(numbers[7]) ? ? for (number in numbers) { ? ? ? ?println(number) ? ? }
? ? // 第二种形式 ?value=0 ? ? val numbers2 = Array(6, ?{value: Int -> (value + 200) }) ? ? for (value in numbers2) { ? ? ? ? println(value) ? //打印值:200 201 202 203 204 205 ? ? }
条件与控制
1.条件
?// 表达式 比 大小 最大值 ? ? val maxValue = if (number1 > number2) number1 else number2
2.when运用
? ? /* val number = 5 ? ? ?when(number) { ? ? ? ? ?1 -> println("一") ? ? ? ? ?2 -> println("二") ? ? ? ? ?3 -> println("三") ? ? ? ? ?4 -> println("四") ? ? ? ? ?5 -> println("五") ? ? ? ? ?else -> println("其他") ? ? ?}*/
? ? /*val number = 745 ? ? when(number) { ? ? ? ? in 1..100 -> println("1..100") ? ? ? ? in 200..500 -> println("200..500") ? ? ? ? else -> println("其他") ? ? }*/
?循环与标签
1.for循环操作
2.自带标签与系统标签
类与对象
1.父类子类 与 构造函数等 ?
// 再Kotlin 全部都是没有默认值的// 再Java 成员有默认值,但是方法内部没有默认值
// lateinit:懒加载 ?没有赋值 就不能使用,否则报错
//类: public final class Person 默认就是这样的,不能被继承, ?可以加open就可以被继承了 open class Person(id: Int) // 主构造 {
? ? // 次构造 ? ? constructor(id: Int, name: String) : this(id) {
? ? }
? ? // 次构造 ? ? constructor(id: Int, sex: Char) : this(id) {
? ? }
? ? // 次构造 ? ? constructor() : this(787) {
? ? }
}
2.接口和抽象类
// 接口默认都是 open interface Callback {
? ? fun callbackMethod() : Boolean
}
// 默认是 public final class Person 不能被人家继承的 ? ? ?abstract有open的特征 相当于open abstract class Person : Callback , Callback2 {
? ? abstract fun getLayoutID() : Int
? ? abstract fun initView()
}
3.data 与 object
// 不会再修改了,可以是使用val // get set 构造 equals hashCode toString, ?copy data class User(var id: Int, val name: String, val sex: Char)
// 只实例一次 ? 相当于 单例 object MyEngine {
? ? fun m() { ? ? ? ? println("M run") ? ? }
}
4.自己写单例
内部类和嵌套类 ?// 这个不是一个内部类,所有拿不到外部类的成员 ? ? // 嵌套类 = 可以在类的里面再写一个类,但是这个类和外部类 不交换 ? ? class Sub {
? ? ? ? fun show() { ? ? ? ? ? ? println() ? ? ? ? }
? ? ? ? class A {
? ? ? ? ? ? class B {
? ? ? ? ? ? ? ? class C {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? // 这个才是内部类 ? ? inner class Sub2 {
? ? ? ? fun show() { ? ? ? ? ? ? println(I) ? ? ? ? }
? ? }
|