Kotlin是最近IO大会推荐的一级语言,也是我们学习的主流方向,其语法实际上不难,融合了很多优秀语言的特性,如面向过程C语言思想。OC语言的代理和类扩展思想。lambda表达式的精简等等。接下来你会想如何学习这个东西又不浪费时间呢。本教程以java语言的思维进行转换学习,一周带你入门Kotlin。
搭建环境
这里我使用的是mac环境,但是我想应该没多大问题,首先该语言是android studio3.0全面支持的,其下载地址是Android Studio预览版。如果在2.3的工具中使用如下教程。
Kotlin的技术地址做了大量的介绍,你可以在官网查看技术的实现.
- 创建新的应用成功
- 找到android studio 的action工具
- 将java工程自动转换成kotlin工程
- 转换后的结果如下
类的使用
声明一个简单类
1.创建kotlin文件,如果创建 你会发现该文件的后缀是kt
2.现在我们创建一个Person类,代码如下
class Person {
//1.声明了2个变量 他们的类型分别是String和Kootlin中的Int
//2.在Kotlin中,基本类型已经不能使用 只能使用kotlin支持的Int Double Long 等
//3.var和val都代表声明一个对象 val声明的对象是无法重新赋值
//4.声明的属性必须默认先赋一个默认的值
//5.内部自动为属性创建setter+getter方法
val name: String =""
var age: Int =0
}
创建一个子类
现在,我们接着创建一个学生类 该类是Person的子类。这里有一点要主要的,默认如果一个类被别的类继承,那么他必须添加open关键字
open class Person {
//声明了2个变量 他们的类型分别是String和Kootlin中的Int
var name: String =""
var age: Int =0
}
Student类的创建如下,如果你创建了Person类,系统会为你默认创建一个空参构造器:
// 这里可以看出Student类继承Person并继承Person的无参构造器
class Student : Person() {
// 默认每个学生都有3个课程
var courses :Int =3
// 默认每个学生身高1.70米
var height: Double =1.70
}
构造器创建
在Kotlin中,构造器分为2种,一种是主构造器,一种是次构造器。主构造器是在类创建的时候顺便指定的,比如我们想在Student类创建的时候指定名称和课程数,那么类的创建如下:
//1.在构造器创建的参数也会让该类内部自动为属性创建setter+getter方法
//2.因为name在父类已经声明过了 这里不需要var关键字
class Student(name: String ,var courses :Int =3) : Person() {
// 默认每个学生身高1.70米
var height: Double =1.70
}
那么问题来了,如果你想在一个类中创建多个次构造器,可以这么写:
class Student(name: String ,var courses :Int =3) : Person() {
// 默认每个学生身高1.70米
var height: Double =1.70
//1.这里的构造必须使用constructor关键字 必须重写主构造器
//2.主构造器我们不传递courses就使用默认的3
//3.次构造器默认不创建setter+getter方法,也不能有val/var关键字,它不会在该类中创建属性
//4.如果该构造器不用赋值 你完全可以去掉方法体的{ }
constructor(nameValue:String,ageValue:String):this(nameValue)
}
方法的创建
学生应该有学习行为,这里没有方法的说法 我们称为函数。所以我们可以为学生创建一系列的方法:
class Student(name: String, var courses: Int = 3) : Person() {
var height: Double = 1.70
//1.fun代表创建一个study函数 传入课程名courseName 返回成绩 类型为Int
//2.每个语句都没有;作为结尾 这是他的特点
fun study(courseName: String): Int {
if (courseName.equals("语文")){
return 99
}
return 80
}
//如果一个方法返回一个数据并只用了一行代码 那么可使用如下写法
fun printf():String = "$name 的身高是 $height"
//如果一个方法不返回数据 可以用Unit代替 你可以认为是void 当然:Unit也可以不写
fun play():Unit{
Log.i("IT520","$name 正在玩!")
}
}
setter/getter方法
默认情况下属性会自动生成setter/getter方法 这类似于OC的做法。但是我们也可以重写这两个方法,只需要在属性后面声明即可,而field指向的就是该属性,因为kotlin不运行直接方法该对象。
class Student(name: String, var courses: Int = 3) : Person() {
var height: Double = 1.70
get() = field
set(value) {
field =value +0.01
}
}
类静态变量
一般在java语言中如果使用静态变量,必须使用static关键字,如果想初始化静态代码块,可以使用static{ }.kotlin提供了类型的功能,比如我们想在Student中创建3个课程的常量,可以这么写:
class Student(name: String, var courses: Int = 3) : Person() {
//该模块下的代码在大部分其他类中都可以调用
companion object{
public val MATH : Int =1
public val CHINESE : Int =2
public val ENGLISH : Int =3
}
}
对象的使用
对象的创建
还记得上面我们创建的构造器吗?
class Student(name: String, var courses: Int = 3) : Person() {
...
}
创建的代码可以如下,var代表声明一个变量:
//1.创建对象没有了new关键字
//2.构造器第二个参数就算不传递 也可以使用默认的
//3.每句代码都没有;
var s1=Student("lean")
var s2=Student("zhangsan",5)
//4.如果一个对象不想马上创建 可以引向null 但是声明必须加? 表示该对象可以为null
var s3: Student? = null
//5.如下添加了?表示 如果s3对象为null 则不调用
s3?.printf()
调用setter/getter方法
安卓大部分setter/getter方法都可以
class Student(name: String, var courses: Int = 3) : Person() {
var height: Double = 1.70
get() = field
set(value) {
field =value +0.01
}
}
//调用内部的setter
s2.height=1.75
//调用getter
val height: Double=s2.height
//打印某个变量
Log.i("IT520","$height")
扩展类的功能
有时候 你使用的第三方库 或者官方的代码用的不爽 如果是java语言的话你可以使用包装类来添加功能,但是kotlin还提供了类似OC的一个功能如下:
operator fun ViewGroup.get(index: Int): View = getChildAt(index)
对,operator操作符就是扩展方法的操作符,该句代码放在某个文件中即可。这里我们扩展的ViewGroup类,为他添加一个get方法。
Kotlin Android Extensions
Android Extensions是有Kotlin官方提供的一个可以帮助我们在代码区获取控件并处理的工具,其网址:Kotlin Android Extensions
在build.gradle 文件的最上面添加:
apply plugin: 'kotlin-android-extensions'
在代码类中添加
import kotlinx.android.synthetic.main.布局名.*
如果在布局中有个控件
<TextView android:id="@+id/hello" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MyActivity" />
在onCreate()方法中,可以这样调用:
hello.setText("Hi!")