美文网首页
Kotlin的解析(上)

Kotlin的解析(上)

作者: 雾里看花六月天 | 来源:发表于2018-11-12 00:22 被阅读61次

    前言

    1. Kotlin的概述:

    1.1 kotlin是什么
    (1)Kotlin是由JetBrains创建的基于JVM的编程语言
    (2)在技术层面上,JAVA和Kotlin是同一级别的,都是以Java Byte Code形式运行在虚拟机上
    1.2kotlin相对于Java有什么优势
    (1)更容易学习:Kotlin是一门包含很多函数式编程思想的面向对象的编程语言
    (2)轻量级:相比于其他的语言,Kotlin函数库更小,由于Android存在65K方法数限制,使得这一点比较重要
    (3)高度互操作性:Kotlin可以和其他Java库友好且简单的进行互相操作
    (4)非常友好的集成Android Studio 以Gradle,Kotlin又一个专门用于Android Studio的插件,以及另一个专门用于Gradle的插件。推出的AS3.0+已经集成了Kotlin
    (5)Kotlin还有很多语法层面的特性,如数据模型、空指针安全、扩展函数等
    1.3 kotlin能做什么
    (1)服务端开发
    (2)以JavaScrip方式运行
    (3)开发Android App

    2.Kotlin基础知识

    2.1基础语法
    2.1.1 定义变量:
    绝大数编程语言都有常量和变量,Kotlin和同源的Java类似,尽管没有常量语法,但可以使用final关键字定一个不可以修改的变量

    Java代码
    int n=30;
    int ok;
    final int m =20;
    ok =123;
    m=10;
    
    Kotlin代码
    var n :Int =30
    var ok:Int 
    val m :Int =20 
    m=10 //编译出错,因为m是常量
    
    不同点

    (1)位置不同
    (2)变量和常量需要关键字:在Kotlin中,定义变量需要var,定义常量需要val开头
    (3)数据类型首字母:在kotlin中,数据类型都以大写字母开头
    (4)如果在定义变量时未进行初始化,就必须要制定数据类型,如果在定义变量时进行了初始化,可以不指定数据的类型,Kotlin编译器会自动根据等号右侧的值推倒数据的类型
    2.1.2 定义函数
    函数定义如下几个部分:
    (1)函数头,包括函数名和识别函数的关键字,如fun、function等
    (2)参数,包括参数名和参数类型
    (3)返回值

    Kotlin 代码
    fun add (m: Int ,n:Int):int
    {
    return m+n
    }
    
    fun process(m: Int):Unit //也可以省略
    {
    println(m*m)
    }
    

    2.1 .3 注解
    (1)但行注解 //
    (2块注解//
    (3)嵌套注解/
    /
    // 新增的Java中是不支持的

    2.2 基础数据类型
    2.2.1 数值类型

    数据类型 占用字节数
    Double 8
    Float 4
    Long 8
    Int 4
    Short 2
    Byte 1
    Kotlin代码
    var m =29
    val n :Byte=10
    m=n  //编译错误,无法将Byte隐式转换为Int
    
    var x:Long =20 //可以将Int类型的值隐式转为Long
    val value:Short=20
    m=value //编译错误,无法将short隐失转换为Int
    

    如果我非要转换呢?莫急Kotlin提供了一系列的方法使用来进行类型之间的转换:

    toByte()   toShort() ... toChar()
    

    Kotlin与Java一样提供了一些特殊的表示方法,表示Long、Float以及十六进制和二进制(八进制目前还不支持)
    (1)表示Long/Float类型的值,在数字后面加上L/F或者l/f
    (2)表示十六进制,在数之前加0x
    (3)表示二进制,数值前面加0b
    (4)如果数值很大,还可以123_3454_567这样表示
    2.2.2 字符类型
    在Kotlin语言中,字符类型用Char描述,不过和JAVA不同的是,在Kotlin中,字符不能直接看作数字

    Java代码
    void check(char c){
    if(c == 97){//可以编译通过
    }
    
    Kotlin代码
    fun check(c: Char){
    if(c == 97){//会产生编译错误
    }
    }
    

    2.2.3 布尔值
    Kotlin语言中的布尔类型用Boolean描述,该类型有两个值:true 和false

    2.2.4 数组

    //使用arrayOf 函数定义可以存储人意的数组
    val arr1 = arrayOf(1,2,3,'a')
    print(arr1[1])
    arr1[2]='b'
    
    //使用arrayOfNulls 函数定义数组
    var arr2 = arrayOfNulls<Int>(10)
    
    val arr3 = Array(10,{i ->(i*i).toString()}
    println(arr3[3])
    

    2.2.5 字符窜

    //第一类字符串(与Java类似)
    var s1 = "hello \nword"
    println(s1)
    
    //第2类字符窜,保留原始格式
    var s3=""" hello
                               word
                hehhe!
    """
    

    字符串模版

    val i=10
    val s1 = "I = $I"
    println(s1) 
    
    val s2 = "abd"
    val str = "$s2 的长度是 ${s2.length}"
    println(str)
    

    2.3 控制流
    2.3.1 条件语句
    Kotlin 代码(传统的if用法)

    var a = 20
    var b =30
    var max :Int
    var min: Int
    if(a>b){
    max = b
    }
    
    if(a>b){
    min=a
    }
    else{
    min=b
    }
    
    

    Kotlin 代码(将if语句作为表达式使用)

    var a=20
    var b=30
    val max =if(a>b)a else b
    println(max)
    
    //if.   else 后面是一个代码块,最后一个表达式将作为返回值
    val min  = if(a>b){
    println(a)
    a
    }
    else{
    println(b)
    b
    }
    

    2.3.2 when 语句(代替了java的switch语句,功能简直是逆天)
    (1)标准的when的用法

    var x=1
    when(x){
    1 -> {
    println("x == 1")
    }
    2->{
    println("x==2")
    }
    else ->{
    println("输出:x")
    }
    }
    

    (2)when作为表达式使用

    var x =1
    var m = when(x){
    1 ,3,4-> { //如果多个分支执行的结果一样,可以在一个分支用(,)分隔多个条件
    println("x ==1")
    10}
    2 -> {
    println("x==2")
    20
    } else ->{
    println("x")
    40
    }
    }
    
    println(m)
    

    (3)使用in关键字

    var n = 25
    when(n){
    in 1..10 -> println("输初")
    !in 30 .. 60 -> print("非30-60范围")
    else -> println("条件未知")
    

    (4)分支条件还可以式函数

    fun getValue(x:Int):Int{
    return x
    }
    
    var n =4
    when(n){
    getValue(2)->println("2")
    getValue(4)->println(4)
    else -> println("没有满足条件!")
    

    2.3.3 for 循环
    枚举数组中所有的元素

    var arr = intArrayof(2,4,5,7,8)
    for(item : Int in arr){
    println(item)
    }
    
    for (i in arr.indices){
    println("arr[$i] = " +arr[i])
    }
    

    2.3.4 while 循环
    和Java里面式一样的,就不多说了,自己可以看一下,没啥变化的

    3. 类和接口

    与Java一样,在Kotlin中,类的声明也使用class,如果只是声明一个空的类的话,Kotlin和Java没有任何的区别,不过要是定义其他的成员,差别还是很大
    3.1 构造器
    3.1.1 主构造器
      在Kotlin中,类允许定义一个主的构造器(primary constructor)和若干个第二构造器(secondary constructor),主构造器是类头的一部分,紧跟在类名的后面,构造器参数是可选的
    kotlin 代码

    class Persion constructor(firstName:String){
    }
    //如果主构造器没有任何的注解或者修饰器,constructor关键字可以省略
    
    class Persion(firstName:String){
    }
    

      目前大家可能有疑惑,代码重只看的见定义主构造器,那么应该在哪里实现主构造器呢?其实,如果是主构造器的话,需要在init块中进行初始化

    class Persion (firstName:String){
    var name = firstName
    init{
    println(firstName);
    }
    }
    //要注意的,主构造器的参数不仅可以用于在init块中,还可以用于对类属性的初始化
    

    3.1.2 第二构造器
      (1)Kotlin类除了可以声明一个主构造器,还可以声明若干个第二构造器,第二构造器需要在类中声明,前面必须加上constructor关键字
    Kotlin 代码

    class Persion {
    constructor(parent:Persion){
    println(parent)
    }
    }
    

      (2)如若类中声明了主构造器,那么所有的第二构造器都需要在声明后面调用主构造器,或者通过另外一个第二构造器间接的调用第二构造器
    Kotlin 代码

    class Demo(var url : String){
    //主构造器实现部分
    init{
    println("主构造器,嘻嘻!无知的人类")
    }
    //第二构造器(通过this直接调用了主构造器)
    constructor(value:Int):this("https://linghit666.doubi.com")
    {
    println(value)
    }
    //通过this直接调用了主函数
    constructor(des:String,url:String):this("{"+url+"}")
    {
    println(des+";;;;"+url)
    }
    //通过第二构造器间接的调用主构造器
    constructor():this(20)
    {
    println("https://www.doubi.com")
    }
    }
    

    注意:在主构造器参数重可以使用var和val,但第二构造器中不能使用var和val,意思就是第二构造器的参数都是直读的,不能在构造器的内部改变参数值
    3.1.3 Kotlin 中的Singleton模式
    Kotlin 代码(Singleton 模式)

    class Singleton private constructor() {
       private object mHolder {
           var INSTANCE = Singleton()
       }
    
       companion object {
           fun getInstance(): Singleton {
               return mHolder.INSTANCE
           }
       }
    }
    //是不是感觉大吃一惊,相对于Java的单例模式,是不是很懵逼,之所以Kotlin方式不同,主要因为Kotlin类不支持静态方法和成员,由于kotlin支持全局函数和变量,因此可以直接使用全局函数和变量来代替静态方法和静态成员变量
    

    3.1.4 Kotlin 函数中默认参数
      现在的很多语言都支持默认参数,例如js、dart、go等,但是遗憾的是Java并不支持,是不是很气,但是值得庆幸的是Kotlin却是支持默认参数

    class Persion(val name:String="Bill",var value :Float = 20.4f,sex :Int) {
      //其实这个是Kotlin的一个语法糖,想知道原理的可以反编一下,查看一下字节码,应该就会懂了
    }
    

    3.2 类成员
      Kotlin 中属性的语法

    var/val <propertyName>[:<propertyType>][=<property_initalizer>]
    [<getter>]
    [<setter>]

    3.2.1 属性的getter和setter 形式
      由于Kotlin从语法上支持属性,因此并不需要为每一个属性单独定义getter和setter方法
    Kotlin 代码

    class Persion {
    
       private var name: String = "sdfsfd"
       fun getName(): String {
           return name
       }
    
       var value: Int = 0
           get() = field
           set(value) {
               field = value
               Log.i("tag","数值: " +";;;;" +value)
           }
    
    }
    

    3.3 类的继承
    3.3.1 修饰符

    private :仅仅在类的内部可以访问
    protected:类似上面的,但是可以在子类中也可以访问
    internal:任何在模块内部的类都可以访问
    public:任何的类都可以访问
    

    示例:

    open class Outer {
        private val a = 1
        protected open val b = 2
        internal val c = 3
        val d = 4 //默认的是public
    
        protected class Nested {
            public val e: Int = 5
        }
    }
    
    class SubClass : Outer() {
        //a不能访问,b、c、d、Nested().e都可以访问
        override val b: Int = 10 //重写父类的常量b
        init {
            b
            c
            d
           Nested().e
        }
    
    }
    

    3.3.2 类的继承
      与Java不同,Kotlin类的继承需要使用(:)冒号,而JAVA你懂得,注意,冒号后面需要调用父类的构造器,与JAVA一样,都是单继承,Kotlin默认时class是final的,也就是说,默认的时候不允许继承,需要显示的使用open

    open class Parent {//使用open声明,才能允许其他类继承
    open val name :String ="know"
        protected var sex =1;
        open protected fun  getYcSex():Int{
            return sex
        }
    
    }
    
    class Child :Parent(){
    override var name:String ="wukong"
        override fun getYcSex(): Int {
            return super.getYcSex()
        }
    }
    //如果在子类中重写方法,就需要在父类相应的方法前面加open,而且要在子类的方法前面加override
    //如果想阻止子类的方法被重写,就要在override前面加final
    //属性重写与方法类似,被重写的属性前面需使用open声明,子类的属性前加override,注意的是,val属性可以被重写成var的,反之不行
    

    3.4 接口
      Kotlin中的接口与Java类似,使用interface关键字声明,一个类可以实现多个接口,而且接口中的属性以及方法都是open的

    3.4.1接口的示例

    interface Extend{
        fun  process()
        fun getYcName():String{
        //允许接口包含默认的方法体,有方法体的,不要求一定重写
            return "nihao"
        }
    }
    
    
    class Child :Parent(),Extend{
        override fun process() {
    
        }
    
        override fun getYcName(): String {
          // 可以不重写
            return super.getYcName()
        }
    
        override fun getYcSex(): Int {
            return super.getYcSex()
        }
    }
    

    3.4.2抽象类
    抽象方法不需要使用open声明,因为抽象方法类本身都可以继承

    abstract class ChouXiang :Extend{
        abstract fun hellow()
    }
    
    class Persion :ChouXiang() {
        override fun hellow() {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    
        override fun process() {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    }
    
    总结

    截止目前的话Kotlin中大概的基础知识,差不多都示例讲解了一下,基本的一些东西都可以看懂知道了,希望对你想了解kotlin有些帮助

    相关文章

      网友评论

          本文标题:Kotlin的解析(上)

          本文链接:https://www.haomeiwen.com/subject/soiffqtx.html