1、引入Kotlin
1、新项目引入
在新建项目的时候勾选Include Kotlin support,如下图
2、现有项目引入
Tools->Kotlin->Configure Kotlin in Project
不管如何引入的本质上都是在build.gradle上引用:
project build.gradle:
在app或者module的build.gradle:
kotlin-android-extensions 可以让我们不在写findviewbyid,后面会详细介绍。
2、基本语法
1、定义属性
Kotlin中定义属性只有2个关键字:var和val
var:可变变量
val:只读变量
var name:String = "qwe" //对应Java String name = "qwe";
var age = 12 //对应Java int age = 12,如果不指定kotlin根据值进行推断
var a:String //编译不过去,Kotlin 定义属性的时候必须初始化或者使用lateinit
lateinit var a1:String
var b:String = null //编译不过去,属性类型如果不加?则代表此属性不能null
var c:String? = null
val d = 0 //只读变量
d = 1 //编译不过去
这些是最基本的,也是我们常用的,当然还有很多细节后面详细说明。
2、定义函数、方法
fun add(a:Int,b:Int):Int{
return 0
}
override fun equals(other: Any?): Boolean {
return super.equals(other)
}
fun:定义方法的关键字
add:方法名
括号内:方法参数,注意参数的类型要放在参数后面,以“:”连接
括号后面接:Int:是返回的类型,如果无返回值可以不写。
override:重写父类方法
对应Java写法:
int add(int a,int b){
return 0;
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
3 定义class
open class Person constructor(var name:String,var age:Int =1) {
init {
//初始化的时候调用
}
/**
* 次构造函数
* this:必须
*/
constructor(name: String):this(name,10){
}
constructor(name: String,age: Int,sex:String):this(name){
}
}
class Student(name: String) : Person(name) {
constructor(name: String, age: Int) : this(name) {
}
}
var person = Person("qw")
var person1 = Person("q",12)
1、定义类的关键字是:class
2、Kotlin的类默认是final,也就是不可被继承,如果想被继承则需要在class前加open关键字。
3、类名后面的constructor()是主构造函数,正常情况下constructor可以省略,但如果在构造函数上有注解则不可省略,比如dagger框架
class DataManager @Inject constructor(){}
4、主构造函数中的参数不需要写get/set方法,访问的时候可以直接这样写:
var age = person.age //get
person.age = 100 //set
5、参数可以有默认值,如age
6、init{} 在初始化的时候调用。
7、次构造函数在类体内,并且必须直接或者间接委托主构造函数(this)
8、实例化:不需要new 关键字
9、类的继承(extends)和实现(implements)用 : 代替
10、注意init{}在次构造函数前执行
11、如果没有定义任何主构造函数和次构造函数,系统默认生成一个无参的主构造函数,而且是public的,如果不想要无参构造函数可以这样:
class DontCreateMe private constructor ()
12、构造函数函数可以用默认值,如果所有的参数都有默认值,系统将会生成一个无参的构造函数,参数使用默认值
4、常用的循环控制语句
1、if…else
1、Kotlin中的if…else和Java一样,在Kotin中if…else可以当作表达式
val max = if (a > b) a else b
2、when
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // Note the block
print("x is neither 1 nor 2")
}
}
when (x) {
in 1..10 -> print("x is in the range") // .. 表示 [1,10] until:[1,10)
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
1、when替代Java中的switch,但是比Java中更加强大
2、上面的代码中有in(在范围内),… 表示 [1,10] until:[1,10),这些后面详细介绍
3、for
for (i in 1..3) {
println(i)
}
for (i in 1 until 3) {
println(i)
}
for (i in 6 downTo 0 step 2) {
println(i)
}
val list = arrayListOf<Int>()
for (i in list){
}
val map = mapOf<String,String>()
for ((key,value) in map){
}
1、for循环提供了list、map等的遍历
2、… 表示 [1,10]
3、until:[1,10)
4、downTo :减
5、step:步幅,实例中表示每次-2
6、对于map可以直接使用解构遍历,解构的用法不仅仅用在遍历,后面会详细介绍。
4、while do…while return 等
这些基本和Java一样,不在介绍。
5、基本类型
这些类型和Java基本一样,但Kotlin没有隐式转换
1、数字类型Double、Float、Long、Int、Short、Byte
var a: Float = 1.0F
//a = 1 //不可以隐式转换,编译报错
a = 1.0.toFloat() //可以显示转换
var b = 123L //L 表示Long类型
var c = 0x12 //16进制
var d = 1f
var e = 1F //f、F表示Float
var a1 = 1_000_000 //可以使用下划线是数字更具可读性
1、Kotlin 不支持8进制
2、Kotlin 不可以隐式转换
3、可以使用下划线是数字更具可读性
2、String
String最终常用的字符串模版:
var s = "$key,${key.toUpperCase()}abc"
替换Java中String类型相加。
1、字符串模版:${}
2、如果后面只有一个简单的属性名可以省略大括号
5访问权限修饰符 private、protected、internal、public
这些基本和Java一样,不在介绍。
6 常用的集合
var array :Array<String> = arrayOf()
var array1 :IntArray = IntArray(10)
var array2 :ArrayList<String> = arrayListOf()
var map:Map<String,String> = mapOf<String,String>()
var map1:HashMap<String,String> = hashMapOf()
1、注意初始化的方式比Java方便。
3 遇到不知道怎么写的怎么办?终极大法
先用java写好,然后Code->Convert Java File to Kotlin File,转过来后记住这种写法,下次就会了。
我们写好了Kotlin code后想看看Kotlin对应的Java写法:
选中Kotlin文件->Tools->Show Kotlin Bytecode:
点击Decompile:
这样更加有助于我们学习。
Kotlin的学习资料:https://blog.csdn.net/mengks1987/article/details/78051857