幼儿园入门
嘀嘀嘀校车来咯--kotlin是啥?了解一哈!
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言(那啥此处划重点--重点了解)。
我觉得这句划重点的话是我们选择kotlin的关键,当然除了google支持的官方语言,它还有很多优点比如说大大减少样板代码的数量,避免空指针异常等整个类的错误,充分利用 JVM、Android 和浏览器的现有库,可用任何 Java IDE 或者使用命令行构建。
开门上车--kotlin的hello world!
Kotlin 程序文件以 .kt 结尾,如:hello.kt 、world.kt。
class KotlinTest(){
fun hello(yourName : String){
println("hello world $yourName")
}
}
fun main(args: Array<String>) {
KotlinTest().hello("Licz")
}
老司机平稳上路--基础语法介绍!
定义基础
- 常变量定义
在Kotlin中常量用val声明,变量用var声明,关键字还是在名称前面,类型用”:“隔开在名称后面,或者也可以直接省略类型直接在名称后用“=”赋值。
var <标识符> : <类型> = <初始化值>
val <标识符> : <类型> = <初始化值>
- 空安全定义
类型后带“?”表示空安全即可为空,名称后面带“?”以及“!!”分别表示可返回null即空安全和抛出空指针异常(简单理解?可以返回null即表示空安全,!!和java原本的类似,什么都不加编译器会在相对时刻检测报错)
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
- 懒加载
by lazy{} (多用于单例模式)只能用在val常量类型且只可以初始化一次想要多次初始化只能重新定义, lateinit 只能用在var变量类型并且不能用在java基本类型和可空类型且可以在任何位置初始化并且可以初始化多次
val name: String by lazy { "bestpay" }
lateinit var myTextView: Textview
- 函数定义
函数定义使用关键字 fun
几种示范
fun sum(a: Int, b: Int){ // Int 参数,返回值 Int
printlb( a + b )
}
fun sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
return a + b
}
fun sum(a: Int, b: Int) = a + b
- 字符串模版
$ 表示一个变量名或者变量值,$varName 表示变量值,${varName.fun()} 表示变量的方法返回值:
var a = 1
val s1 = "a is $a"
val s2 = "${s1.replace("is", "was")}, but now is $a" // 解释一下${}内部可以是函数表达式
- 类型转换以及自检判断
is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。
if (obj is String) {
// 做过类型判断以后,obj会被系统自动转换为String类型
return obj.length
}
if (obj is String && obj.length > 0)
return obj.length
基础数据类型
- Kotlin 的基本数值类型包括Byte、Short、Int、Long、Float、Double等。不同于Java的是,字符不属于数值类型,是一个独立的数据类型。其余基本同java。
- 注意几点:
16 进制以 0x 开头:0x0F;
2 进制以 0b 开头:0b00001011;
长整型以大写的 L 结尾:123L;
Double 默认写法: 123.5, 123.5e10;
Float 使用 f 或者 F 后缀:123.5f; - 也可以使用下划线使数字常量更易读(下划线无实际意义类似于注释的意思,怎么看着方便怎么加)
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
- Kotlin 中没有基础数据类型,只有封装的数字类型,你每定义的一个变量,其实 Kotlin 帮你封装了一个对象,这样可以保证不会出现空指针。数字类型也一样,所有在比较两个数字的时候,就有比较数据大小和比较两个对象是否相同的区别了。在 Kotlin 中,三个等号 === 表示比较对象地址,两个 == 表示比较两个值大小。
条件以及循环控制
-
条件控制
- if表达式
和java那一套很类似,不过更强大
- if表达式
val max = if (a > b) a else b //作为表达式,取代了java的三元操作符
- when表达式
移除了switch使用更加强大的when代替,when的子式可以是常亮、变量、返回数值的表达式、返回boolean值的表达式,强大到替换if...else if
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
//类似switch的用法
3,4 -> print("x == 3 or x == 4")
//由于没有break 如果两个值的处理逻辑一样可以这样用“,”隔开
is String -> x.startsWith("prefix")
//检测一个值是(is)或者不是(!is)一个特定类型的值
else -> { // 注意这个括号
//注意else相当于default
print("x 不是 1 ,也不是 2")
}
}
when (x) {
in 1..10 -> print("x is in the range")
!in validNumbers -> print("x is not valid")
//此处在(in)或者不在(!in)一个区间(注意区间,这里没细说)
else -> print("none of the above")
}
when {
x.isGood() -> print("x is good")
x.isBad() -> print("x is bad")
else -> print("x is X")
//此处为替代if...else if的用法
}
-
循环控制
- for循环
有变化并且多出了几个变种
- for循环
for (test in collection) print(test)//可以对任何提供迭代器(iterator)的对象进行遍历
for (test: Int in ints) {
//循环体是一个代码块
// ……
}
- while与do...while循环
基本同java无区别
while( 布尔表达式 ) {
//循环内容
}
do {
//代码语句
}while(布尔表达式);
- 返回和跳转
return:默认从最直接包围它的函数或者匿名函数返回。
break:终止最直接包围它的循环。
continue:继续下一次最直接包围它的循环。
for (i in 1..8) {
if (i==2) continue // i 为 2 时跳过当前循环,继续下一次循环
println(i)
if (i>=5) break // i 为 5 时 跳出循环
}
类以及对象
- 简述
kotlin的类可以包含的和java代码的类差不多,有构造函数、内部类、对象声明、属性、函数,虽然类型差不多但是形式大大的不一样。
class Bestpay{ //类名称 bestpay
fun writeBug(){println("bug")}
//大括号内是类内部内容
}
class Empty //定义空类
- 类属性
var声明可变,val声明不可变
注意一点kotlin中是没有new这个关键字的直接在“=”后面写要实例化的类就可以
一般要使用一个类属性或某些方法只要在类后直接“.”属性名
class Test{
val age : Int = 1
val name : String = "test"
fun writeBug(){println("bug")}
}
val bestpay = Test() //注意没有new关键字
bestpay.name
bestpay.age
- 构造方法
主构造方法注意constructor关键字(可省略)还有init()函数
class Person constructor(firstName: String) {}
class Person (firstName: String) {
//此处没有注解或者可见性修饰符省略constructor关键字
init{
//初始化代码块
//参数使用往上看!!! 就是类名称后面括号里面的东西!!!
firstName == “li”+firstName
}
}
次构造方法也叫做二级构造函数,需要加前缀constructor
class Person {
constructor(child: Person) {
}
}
class Person(val name: String) {//主构造函数
constructor (name: String, age:Int) : this(name) {//次构造函数
// 初始化...
}
class Person(val name: String) {//主构造函数
constructor (name: String, age:Int,firstName:String) : this(name,age) {//次构造函数
// 初始化...
}
注意如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用this关键字。
- 抽象类
abstract关键字了解一哈 - 内部类
内部类使用 inner 关键字来表示。
内部类会带有一个对外部类的对象的引用,所以内部类可以访问外部类成员属性和成员函数。
class Test {
val inn = "123"
inner class innerTest{
fun innertest(){
var t =this@Test
t.inn.equals(inn)
}
}
}
嵌套类
内部类包含嵌套类,嵌套类没有inner关键字匿名内部类
定义和java类似,没有名字直接实例化使用,常用于接口等回调。
class Test {
var v = "成员属性"
fun setInterFace(test: TestInterFace) {
test.test()
}
}
/**
* 定义接口
*/
interface TestInterFace {
fun test()
}
fun main(args: Array<String>) {
var test = Test()
/**
* 采用对象表达式来创建接口对象,即匿名内部类的实例。
*/
test.setInterFace(object : TestInterFace {
//注意此处接口的调用方式
override fun test() {
println("对象表达式创建匿名内部类的实例")
}
})
}
- 类修饰符
- classModifier: 类属性修饰符,标示类本身特性。
abstract // 抽象类
final // 类不可继承,默认属性
enum // 枚举类
open // 类可继承,类默认是final的
annotation // 注解类
- classModifier: 类属性修饰符,标示类本身特性。
- accessModifier: 访问权限修饰符
private // 仅在同一个文件中可见
protected // 同一个文件中或子类可见
public // 所有调用的地方都可见(默认修饰符,什么都不加就是public)
internal // 同一个模块中可见(包内可见) - 多嘴一句注意data类它是kotlin中特有的bean类用来写pojo超级方便
data class User(val name: String, val age: Int)
data class TestData(@SerializedName("success") var success: String, @SerializedName("errorCode") var errorCode: String) {
}
就这样简单的一个data class,加上主构造函数就构成了kotlin的特有pojo类它有编译器自动生成的equals()/hashCode()方法、toString()方法、componentN()方法、copy()方法以及“set/get”等方法。
一些补充
- “:”冒号的妙用 类的继承、声明常变量的类型、函数的返回值等都有它的身影,除了以上还有Kotlin最终会还是编译成Java字节码,使用到Java类是必然的也是要用到“:”冒号的
val intent = Intent(this, Test::class.java)
- 除了冒号还有一个较重要的符号@,this后面加上@对象表明指返回哪一个(内部类return处多用)
class User {
inner class FamilyUser{
fun getUser(): User{
//返回User
return this@User
}
fun getFamilyUser(): FamilyUser{
//返回FamilyUser
return this@FamilyUser
}
}
}
到站下车幼儿园的门在眼前--一些要说的东西!
暂时对databinding的支持不是很友好,一起使用会出现特别多奇葩的看不懂的错误。
butterknife无法使用,取而代之的是kotterknife(也是JakeWharton大神的作品)。
转换为Kotlin工程最简单的方法Tools -> Kotlin -> Configure Kotin in Project。
Code/Conver Java File to Kotlin File单独的类转换成Kotlin代码。
将Java代码复制到Kotlin文件会提示转换也是可以很方便的进行差异对比。
但是有一句说一句哈ide转换出来的kotlin代码那是给机器看的 Orz。。。。。。。
反射不是很好用,这部分需要引入一个很大的库来做,BUT 我们可以直接用java写。
kotlin-ktx
2018年2月5号的时候,Google 发布了一款 Kotlin 的扩展库,叫 Android KTX,它能使 Android 上的 Kotlin 代码更简洁,从而提高开发者的效率和使用体验。
Android KTX 其实就是一个 Kotlin 代码的扩展库,Google 把我们开发的时候,比较常用的一些代码块,进行封装,然后在这个基础上,提供更良好的 API,供开发者使用。
总的来说呢,这个东西就是java代码下的xxxUtils库,但是由于kotlin的 Extensions 特性,这个库可以使用起来有着媲美原生api的使用体验。
来看看ktx包下面都包括了什么!
[图片上传失败...(image-8d70d4-1527574739510)]
看了之后的感觉是不是很刺激?从animation到text,从view到net统统都有。
OK废话咱们就不多说了直接上码:
github地址
文档地址