一周入门Kotlin(一)

Kotlin是最近IO大会推荐的一级语言,也是我们学习的主流方向,其语法实际上不难,融合了很多优秀语言的特性,如面向过程C语言思想。OC语言的代理和类扩展思想。lambda表达式的精简等等。接下来你会想如何学习这个东西又不浪费时间呢。本教程以Java语言的思维进行转换学习,一周带你入门Kotlin。

搭建环境

这里我使用的是mac环境,但是我想应该没多大问题,首先该语言是Android studio3.0全面支持的,其下载地址是Android Studio预览版。如果在2.3的工具中使用如下教程

Kotlin的技术地址做了大量的介绍,你可以在官网查看技术的实现.

  1. 创建新的应用成功
  2. 找到android studio 的action工具 
    这里写图片描述
  3. 将java工程自动转换成kotlin工程 
    这里写图片描述
  4. 转换后的结果如下 
    这里写图片描述

类的使用

声明一个简单类

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建一个子类

现在,我们接着创建一个学生类 该类是Person的子类。这里有一点要主要的,默认如果一个类被别的类继承,那么他必须添加open关键字

open class Person {

    //声明了2个变量 他们的类型分别是String和Kootlin中的Int
    var name: String =""
    var age: Int =0

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Student类的创建如下,如果你创建了Person类,系统会为你默认创建一个空参构造器:

// 这里可以看出Student类继承Person并继承Person的无参构造器
class Student : Person() {

    // 默认每个学生都有3个课程
    var courses :Int =3
    // 默认每个学生身高1.70米
    var height: Double =1.70

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

构造器创建

在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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

那么问题来了,如果你想在一个类中创建多个次构造器,可以这么写:

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)

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

方法的创建

学生应该有学习行为,这里没有方法的说法 我们称为函数。所以我们可以为学生创建一系列的方法:

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 正在玩!")
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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
        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

类静态变量

一般在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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

对象的使用

对象的创建

还记得上面我们创建的构造器吗?

class Student(name: String, var courses: Int = 3) : Person() {
    ...
}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

创建的代码可以如下,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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

调用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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

扩展类的功能

有时候 你使用的第三方库 或者官方的代码用的不爽 如果是java语言的话你可以使用包装类来添加功能,但是kotlin还提供了类似OC的一个功能如下:

operator fun ViewGroup.get(index: Int): View = getChildAt(index)

对,operator操作符就是扩展方法的操作符,该句代码放在某个文件中即可。这里我们扩展的ViewGroup类,为他添加一个get方法。

Kotlin Android Extensions

Android Extensions是有Kotlin官方提供的一个可以帮助我们在代码区获取控件并处理的工具,其网址:Kotlin Android Extensions

  1. 在build.gradle 文件的最上面添加:

        apply plugin: 'kotlin-android-extensions'
    • 1
    • 1
  2. 在代码类中添加

    import kotlinx.android.synthetic.main.布局名.*
    • 1
    • 1
  3. 如果在布局中有个控件

    <TextView
         android:id="@+id/hello"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="Hello World, MyActivity" />
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
  4. 在onCreate()方法中,可以这样调用:

    hello.setText("Hi!")
    • 1
    • 1

Kotlin是最近IO大会推荐的一级语言,也是我们学习的主流方向,其语法实际上不难,融合了很多优秀语言的特性,如面向过程C语言思想。OC语言的代理和类扩展思想。lambda表达式的精简等等。接下来你会想如何学习这个东西又不浪费时间呢。本教程以Java语言的思维进行转换学习,一周带你入门Kotlin。

搭建环境

这里我使用的是mac环境,但是我想应该没多大问题,首先该语言是Android studio3.0全面支持的,其下载地址是Android Studio预览版。如果在2.3的工具中使用如下教程

Kotlin的技术地址做了大量的介绍,你可以在官网查看技术的实现.

  1. 创建新的应用成功
  2. 找到android studio 的action工具 
    这里写图片描述
  3. 将java工程自动转换成kotlin工程 
    这里写图片描述
  4. 转换后的结果如下 
    这里写图片描述

类的使用

声明一个简单类

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建一个子类

现在,我们接着创建一个学生类 该类是Person的子类。这里有一点要主要的,默认如果一个类被别的类继承,那么他必须添加open关键字

open class Person {

    //声明了2个变量 他们的类型分别是String和Kootlin中的Int
    var name: String =""
    var age: Int =0

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Student类的创建如下,如果你创建了Person类,系统会为你默认创建一个空参构造器:

// 这里可以看出Student类继承Person并继承Person的无参构造器
class Student : Person() {

    // 默认每个学生都有3个课程
    var courses :Int =3
    // 默认每个学生身高1.70米
    var height: Double =1.70

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

构造器创建

在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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

那么问题来了,如果你想在一个类中创建多个次构造器,可以这么写:

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)

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

方法的创建

学生应该有学习行为,这里没有方法的说法 我们称为函数。所以我们可以为学生创建一系列的方法:

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 正在玩!")
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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
        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

类静态变量

一般在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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

对象的使用

对象的创建

还记得上面我们创建的构造器吗?

class Student(name: String, var courses: Int = 3) : Person() {
    ...
}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

创建的代码可以如下,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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

调用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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

扩展类的功能

有时候 你使用的第三方库 或者官方的代码用的不爽 如果是java语言的话你可以使用包装类来添加功能,但是kotlin还提供了类似OC的一个功能如下:

operator fun ViewGroup.get(index: Int): View = getChildAt(index)

对,operator操作符就是扩展方法的操作符,该句代码放在某个文件中即可。这里我们扩展的ViewGroup类,为他添加一个get方法。

Kotlin Android Extensions

Android Extensions是有Kotlin官方提供的一个可以帮助我们在代码区获取控件并处理的工具,其网址:Kotlin Android Extensions

  1. 在build.gradle 文件的最上面添加:

        apply plugin: 'kotlin-android-extensions'
    • 1
    • 1
  2. 在代码类中添加

    import kotlinx.android.synthetic.main.布局名.*
    • 1
    • 1
  3. 如果在布局中有个控件

    <TextView
         android:id="@+id/hello"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="Hello World, MyActivity" />
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
  4. 在onCreate()方法中,可以这样调用:

    hello.setText("Hi!")
    • 1
    • 1

猜你喜欢

转载自blog.csdn.net/songjianzaina/article/details/72808331