Android培训
美国上市Android培训机构

400-111-8989

热门课程

Kotlin知识点总结,Kotlin简介、配置、语法和类知识点

  • 时间:2017-05-22
  • 发布:Android培训
  • 来源:Android教程

一、Kotlin:简介

前言:

谷歌宣布,将Kotlin语言作为安卓开发的一级编程语言。

      Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。

      谷歌称还将与JetBrains公司合作,为Kotlin设立一个非盈利基金会。

 

1、简介:

   Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。JetBrains,作为目前广受欢迎的 Java IDE IntelliJ 的提供商,在 Apache 许可下已经开源其Kotlin 编程语言。

   可以理解为类似于iOS的Swift。

 

2、特性:

  • 轻量级:
    • 这一点对于Android来说非常重要。项目所需要的库应该尽可能的小。Android对于方法数量有严格的限制,Kotlin只额外增加了大约6000个方法。
  • 互操作:
    • Kotlin可与Java语言无缝通信。这意味着我们可以在Kotlin代码中使用任何已有的Java库;因此,即便这门语言还很年轻,但却已经可以使用成百上千的库了。除此之外,Kotlin代码还可以为Java代码所用,这意味着我们可以使用这两种语言来构建软件。你可以使用 Kotlin开发新特性,同时使用Java实现代码基的其他部分。
  • 强类型:
    • 我们很少需要在代码中指定类型,因为编译器可以在绝大多数情况下推断出变量或是函数返回值的类型。这样就能获得两个好处:简洁与安全。
  • Null安全:
    • Java最大的一个问题就是null。如果没有对变量或是参数进行null判断,那么程序当中就有可能抛出大量的 NullPointerException,然而在编码时这些又是难以检测到的。Kotlin使用了显式的null,这会强制我们在必要时进行null检查。

 

二、Kotlin:Android Studio中的配置

注意:

Android Studio是Intellij IDEA的插件实现,Intellij IDEA是由JetBrains开发,Kotlin 就是JetBrains创造的。所以,要想使用Kotlin,你必须先使用起来Android Stduio。

1、安装插件  选择这里的Kotlin相关的插件安装,有些文档中介绍有2个插件,其实目前这一个包含另一个了,所以安装一个就行,安装完之后会要求你重新打开Android Studio。

  • Kotlin:Android Studio中的配置

2、重启完Android Studio之后在任意一个包下右键New , 会发现多了一个"Kotlin File/Class" 和 "Kotlin Activity"

Kotlin:Android Studio中的配置

3、"Kotlin File/Class"即 Kotlin类或者文件

 "Kotlin Activity"即 Kotlin的Activity类

4、试着建一个"Kotlin File/Class" 文件

Kotlin:Android Studio中的配置

     发现右上角有一个配置选项“Configure” , 默认第一次使用都需要配置一下

Kotlin:Android Studio中的配置

选择对所有modules配置还是对指定的配置

选择OK后,会跳到build.gradle文件下,你会发现app下的build.gradle和根目录下的build.gradle文件都会出现变化

注意黄色背景部分,没有的自己手动添加上去。

 

根目录下的build.gradle: 

buildscript {
    ext.kotlin_version = '1.1.2-4'
    ext.support_version = '23.1.1'
    ext.anko_version = '0.8.2'


    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}


allprojects {
    repositories {
        jcenter()
    }
}


task clean(type: Delete) {
    delete rootProject.buildDir
}

app目录下的build.gradle:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'


android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"


    defaultConfig {
        applicationId "com.xqx.xautoviewgroup"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        debug {
            // 显示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
            versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
        }


        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            //Zipalign优化
            zipAlignEnabled true


            // 移除无用的resource文件
            shrinkResources true
            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


        }
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }


}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.jph.takephoto:takephoto_library:4.0.3'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.anko:anko-common:$anko_version"


}
repositories {
    mavenCentral()
}

四、 Kotlin的基本类型及语法

 在Android Studio中我们已经可以进行Kotlin编程了,接下来开始学习Kotlin的基本类型及语法。

1、基本类型

在 Kotlin 中,所有变量的成员方法和属性都是一个对象。

一些类型是内建的,它们的实现是优化过的,但对用户来说它们就像普通的类一样。

Kotlin的基本类型及语法 

注意,第一个字母大写,Kotlin 区分大小写

主要是以下几种字面值常量:

--数型: 123 --长整型要加大写 L : 123L --16进制:0x0f --二进制:0b00001011

注意不支持8进制

Kotlin 也支持传统的浮点数表示:

-- 默认 Doubles : 123.5 , 123.5e10 -- Floats 要添加 f 或 F :123.5f

 

2、基本语法

知道了Kotlin支持哪些基本类型。下面开始了解基本语法。

1、Kotlin定义声明一个属性的两种写法

· var : 变量

· val  : 常量

注意:不管定义常量(val)还是变量(var) 都必须要给定一个值。

声明变量/常量的语法为 :  var  age : Int = 1;

 val name : String = "Alice" ;

                            常量(val)/变量(var) 属性名 : 类型 = 初始值 ;

 

     Kotlin还提供一种写法 var age = 1; 

发现省去了 : Int 即 声明这个属性是什么类型的,也能编译通过,这就是Kotlin的特点,自动推导出该值是什么类型。

  都没有报错。

 

①、变量var的语法

很奇怪java中 变量 并不要求要初始值,我们看下Kotlin中 不给一个变量初始化会发生什么。

Kotlin的基本类型及语法     

结果是报错:提示需要添加一个初始值。

选中" Add initializer" 之后 会发现系统给我们一个初始值 0 。

看一下上述6种基本类型 系统给定的初始值:

Kotlin的基本类型及语法

 

②、常量val的语法:

声明常量的时候和变量一样也需要提供一个初始值,并且这个值是之后无法修改的。

Kotlin的基本类型及语法

上面可以看到,定义了一个Int类型的常量age ,值为1。 

后续代码中对age常量进行赋值修改,提示 让 age这个常量 作为 变量类型。选中会发现 val age:Int = 1 --> var age:Int =1;

Kotlin的基本类型及语法

综上:val声明常量和java中final使用一致,var声明变量必须要给定一个初始值。

2、Kotlin注释规范

与java一致

①、  单行注释

②、块级注释

3、kotlin定义一个方法/函数

基本格式:

fun 方法名(参数名 : 类型 ,参数名 : 类型 ...) : 返回类型{

}

举例:定义一个方法,传入两个类型Int的参数,计算参数之和,返回Int类型的结果。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ktest)
    var result : Int = sum(10,20) ;
}


/**
 * 计算两个Int类型的和并返回
 */
fun sum(a: Int , b: Int) : Int{     
    return a + b
}

注意点:方法中的参数不需要加var 

Kotlin的基本类型及语法

   看到这,大家也应该会创建基本的方法了。但是有个疑惑,如果一个方法不需要返回值呢,类似于Java中的 void

Kitlin是用Unit处理的,可以看到,sum方法没有返回值, 调用的时候 写法是错误的,无法将一个无返回值的方法转为某一个类型。

正确写法如下:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ktest)
    var a = sumA(10,20) ;
}
/** * 计算两个Int类型的和并返回 */ 
fun sum(a: Int, b: Int): Unit {
//不做处理 
}


//如果无返回值,Unit也可以省略
fun sumA(a:Int , b:Int) {   
      //不做处理
}

 

 

 三、代码风格

1、命名风格

 

--使用骆驼命名法(在命名中避免下划线)

 

--类型名称首字母大写

 

--方法和属性首字母小写

 

--缩进用四个空格

 

--public 方法要写说明文档,这样它就可以出现在 Kotllin Doc 中

 

2、Unit

如果函数返回 Unit ,返回类型应该省略:

Kotlin的基本类型及语法

 

 

五、Kotlin:类

Kotlin有了一个基本的认识,往后开始深入介绍Kotlin的实战使用。

1、表现形式

首先看一段Java中定义类的形式,定义三个属性,每一个属性对应一个get、set方法,有一个toString()方法

/*
* @author xqx
* @emil djlxqx@163.com
* create at 2017/5/18
* description: 自己写的类,人,包含姓名,年龄,性别
*/


public class XPatient {
    private String name;  //姓名
    private int age;      //年龄
    private int sex;     //性别  1、男    2、女


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public int getAge() {
        return age;
    }


    public void setAge(int age) {
        this.age = age;
    }


    public int getSex() {
        return sex;
    }


    public void setSex(int sex) {
        this.sex = sex;
    }


    @Override
    public String toString() {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

接下来我们看这个类对应的Kotlin的表现形式:

跟着下面的操作做一个处理,让我们这个类对应的 .java 文件转化为对应的 .kt 文件

之后转换完成我们看下转换后的代码:

看一下变化:

1、代码量少了很多

2、get/set方法都没有了

3、只有一个重写的toString()方法。

4、类的属性都有一个默认的初始值

/*
* @author xqx
* @emil djlxqx@163.com
* create at 2017/5/18
* description: 自己写的类,人,包含姓名,年龄,性别
*/


class XPatient {
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女


    override fun toString(): String {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}'
    }
}

 

2、定义类的构造方法

首先看Java类的构造

Java中定义构造方法特点:

1、方法名需要和类名一致

2、参数可以任意属性值的组合,也可以不写

3、可以有多个构造方法

在看Kotlin的类,这里有个知识点 :Kotlin类中可以有一个主构造方法 和 一个至多个二级构造方法。

①、主构造方法的的写法:

直接写在类的头部,类似于定义方法的形式 加一个参数。

需要添加 init{} 代码块来处理对主构造方法传来的参数的初始化操作。

②、二级构造方法:

为了实现类似于Java中一个类具有多种构造方法

二级构造函数最终委托到主构造方法,中间可以有0个或多个中间二级构造方法。

个人理解,如果涉及到一个类有多个构造方法的时候,主构造方法尽量设为无参的。

如下:当创建一个对象XPatient("Alice",18); 的时候 会调用二级构造方法 constructor(name: String?,age : Int):this(name){}

该二级构造方法再委托(调用)对应的一个参数name(String) 对应的二级构造方法  constructor(name:String?):this( ){}

一个参数的该二级构造方法最终委托(调用)主构造方法

下面举例测试:

class XPatient() {
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女




    /*进行主构造函数的初始化*/
    init {
        Log.i("xqxinfo","调用了无参数的主构造方法");
    }


    /*传入(name)*/
    constructor(name:String?):this( ){
        this.name = "Alice";
        Log.i("xqxinfo","调用了一个参数的二级构造方法");


    }
    /*传入(name,age)*/
    constructor(name: String?,age : Int):this(name){
        this.age = age+1;
        Log.i("xqxinfo","调用了两个参数的二级构造方法");
    }


    override fun toString(): String {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}'
    }
}

进行测试:

val patient = XPatient("Alice", 18) Log.i("xqxinfo", "该对象的属性值" + patient.toString())

打印结果:

05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了无参数的主构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了一个参数的二级构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了两个参数的二级构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 该对象的属性值XPatient{name='Alice', age=19, sex=0}

    这里看一下,不要以为先执行了主构造方法,然后再执行一个参数的,再执行两个参数的二级构造方法。

 实际还是先执行了创建对象的那个参数 对应的两个参数的二级构造方法,两个参数的构造方法调用一个参数的构造方法,一个参数的又调用了主构造方法。

所以当主构造方法执行完之后,会返回来执行一个参数的构造方法内的处理,一个参数的构造方法执行完了,再执行两个参数的构造方法内的处理。类似于递归。

   所以打印结果如上代码所示。

 

3、类的继承

关于Kotlin的类有几个知识点需要先知道:

1、默认情况下,任何类都是根继承自Any(类似于Java中的Object)

2、默认情况下,任何类都是不可继承的(final)

3、只有被申明open或者abstract的类可以被继承

 

继承形式:

 

openclassAnimal(name: String) // 被继承的类 需要open修饰

classPerson(name: String, surname: String) : Animal(name) //继承Animal类的类

 

 

上一篇:20 个开源 Android App,帮助提高开发效率和技巧
下一篇:Android开发模块化知识点总结和经验分享

Android信鸽推送全解

探究Android触摸事件传递机制

Android三种动画使用介绍

Android 新特性之文件加密对TEE的要求

选择城市和中心
贵州省

广西省

海南省